You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:01:35