使用Java以二进制格式将图像存储在数据库中

发布于 2021-01-30 17:49:39

我正在研究项目,但遇到了一些问题,我进行了搜索,但是找不到完整的学习资源,我需要使用我的Java程序将图像存储在SQL
Server数据库中,并且需要使用“返回检索”,图像的大小不大,它们介于30到50
K之间,我可以使用toolKit中的getImage()方法从磁盘加载图像

Image imm = Toolkit.getDefaultToolkit().getImage("URl");

,但我不知道如何将该图像转换为二进制格式并存储在数据库中,然后从数据库中检索回来。我想通过查看几个站点将其存储在VarBinary中,我发现SQL
Server中的图像类型即将退役。

关注者
0
被浏览
100
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    虽然在数据库中存储很大的二进制对象不是一个好主意,但是Microsoft研究论文“
    至BLOB或不至BLOB:数据库或文件系统中的大对象存储”表明,如果对象大小小于256K,这是一种有效的方法。
    。因此,听起来您已经达到了3万张图像存储数据库的最佳位置。

    您可以使用以下网址从URL加载图像作为缓冲图像:

    BufferedImage imm = ImageIO.read(url);
    

    然后使用以下命令将其转换为字节数组:

    byte[] immAsBytes = 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    //use another encoding if JPG is innappropriate for you
    ImageIO.write(imm, "jpg", baos );
    baos.flush();
    byte[] immAsBytes = baos.toByteArray();
    baos.close();
    

    然后按照本文的建议将字节数组存储为VARBINARY数据库中。在JDBC代码中,应该将字节数组包装在ByteArrayInputStream中,并将PreparedStatement参数设置为BinaryStream:

    PreparedStatement pstmt = commection.prepareStatement("INSERT INTO IMAGES (image) VALUES(?)");
    ByteArrayInputStream bais = new ByteArrayInputStream(immAsBytes);
    pstmt.setBinaryStream(1, bais, immAsBytes.length);
    pstmt.executeUpdate();
    pstmt.close();
    

    要从数据库中取出图像,请使用ResultStatement.getBlob():

    Blob immAsBlob = rs.getBlob();
    byte[] immAsBytes = immAsBlob.getBytes(1, (int)immAsBlob.length()));
    

    最后,将字节数组转换为BufferedImage并对其进行处理:

    InputStream in = new ByteArrayInputStream(immAsBytes);
    BufferedImage imgFromDb = ImageIO.read(in);
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看