小编典典
虽然在数据库中存储很大的二进制对象不是一个好主意,但是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);
2020-09-28