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

时间:2014-02-01 16:07:31

标签: java image swing sql-server-2008-r2 binary-data

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

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

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

2 个答案:

答案 0 :(得分:5)

虽然在数据库中存储非常大的二进制对象并不是一个好主意,但微软研究论文“To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem"表明,如果对象大小小于256K,这是一种有效的方法。所以听起来你已经命中了数据库存储的最佳位置,包含30K图像。

您可以使用以下方式将图片作为缓冲图像加载:

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();

然后将字节数组as recommended by this article作为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);

答案 1 :(得分:0)

将数据库等大型资源放入数据库通常不是一个好主意,除非您在使用它们时确实需要ACID合规性。数据库转储和生成它们所需的时间大大增加,您将需要使用更复杂和脆弱的增量备份。

通常,将图像存储在文件系统上可能更有效,并且只有在确定图像资源已成功创建后才将图像路径放到数据库中。