如何用Java将图片以Blob格式存入MySQL及Joget场景实现指导
1. Java将图片文件以Blob格式存入MySQL的实现
步骤1:准备MySQL表结构
先创建包含Blob类型字段的表,推荐使用MEDIUMBLOB(支持最大16MB文件,满足多数图片存储需求):
CREATE TABLE user_avatars ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL UNIQUE, avatar MEDIUMBLOB NOT NULL );
步骤2:Java代码实现
使用JDBC将图片文件转为InputStream,再通过PreparedStatement写入数据库:
import java.io.File; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class ImageBlobStorage { public static void main(String[] args) { // 数据库连接参数 String dbUrl = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC"; String dbUser = "your_db_user"; String dbPassword = "your_db_password"; // 图片文件路径 String imagePath = "/path/to/your/image.png"; int targetUserId = 1001; // 示例用户ID try ( Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword); FileInputStream imageStream = new FileInputStream(new File(imagePath)); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO user_avatars (user_id, avatar) VALUES (?, ?)") ) { pstmt.setInt(1, targetUserId); pstmt.setBinaryStream(2, imageStream, new File(imagePath).length()); int affectedRows = pstmt.executeUpdate(); if (affectedRows > 0) { System.out.println("图片已成功写入数据库"); } } catch (Exception e) { e.printStackTrace(); } } }
2. Joget中实现用户图片Blob存储的方案
一、MySQL端准备
和上述步骤一致,先创建包含MEDIUMBLOB字段的用户表:
CREATE TABLE system_user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, full_name VARCHAR(100), avatar MEDIUMBLOB );
二、Joget中的代码编写位置
在Joget里,推荐在**表单的「提交后事件」**中编写Groovy脚本,获取上传的图片并写入数据库:
import org.joget.apps.app.service.AppUtil; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import javax.servlet.http.HttpServletRequest; // 获取当前请求对象 HttpServletRequest request = AppUtil.getRequest(); // 获取表单上传组件的文件流(参数为上传组件的「名称」属性值) InputStream avatarStream = request.getFile("avatar_upload").getInputStream(); // 获取表单中的用户数据 String username = request.getParameter("username"); String fullName = request.getParameter("full_name"); // 获取Joget内置数据库连接 Connection conn = AppUtil.getAppPluginConnection(); try { // 插入用户数据及头像 String sql = "INSERT INTO system_user (username, full_name, avatar) VALUES (?, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, username); pstmt.setString(2, fullName); pstmt.setBinaryStream(3, avatarStream); pstmt.executeUpdate(); } catch (Exception e) { System.err.println("图片存储失败: " + e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { conn.close(); } }
补充说明
- 确保表单上传组件的「名称」属性与脚本中的
"avatar_upload"完全一致 - 若需更新用户头像,将SQL语句改为
UPDATE即可 - 可在Joget上传组件的设置中配置「最大文件大小」,限制上传图片的体积
内容的提问来源于stack exchange,提问作者Ali Hamza
相关产品推荐
相关产品推荐

