使用 Java 以二进制格式将图像存储在数据库中
我正在处理我的项目并遇到一些问题,我搜索了它,但找不到有意义的完整学习资源,我需要的是使用我的 Java 程序将图像存储在 SQL Server 数据库中,并且需要返回检索,图像不是更大的尺寸,它们在 30 到 50 K 之间,我可以使用 toolKit 中的 getImage() 方法从我的磁盘加载图像
I am working around my project and got some Problem, I searched for it , but couldn't find meaning full learning resource, What I need is to Store Image in SQL Server Database using my Java program , and will need that Back to Retrieve, images are not of larger size they are ranging between 30 and 50 K, I can load images from my Disk by using getImage() method in toolKit
Image imm = Toolkit.getDefaultToolkit().getImage("URl");
,但我不知道如何将该图像转换为二进制格式并存储在数据库中,然后从数据库中检索回来.我想通过查看几个站点将其存储在 VarBinary 中,我发现 SQL Server 中的图像类型即将停用.
, but i don't know How to convert that image to Binary Format and to store in Database, and then retrieve Back From Database. I want to Store that in VarBinary s by looking around several sites i found that the image type in SQL Server is soon going to Retire.
推荐答案
虽然在数据库中存储非常大的二进制对象并不是一个好主意,但微软研究论文To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem" 表明如果对象大小小于256K.所以听起来您已经达到了使用 30K 图像进行数据库存储的最佳选择.
While it's not a good idea to store very large binary objects in the database, the Microsoft research paper "To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem" indicates it's an efficient approach if object sizes are less than 256K. So it sounds like you've hit the sweet spot for database storage with 30K images.
您可以使用以下方法从 URL 将图像作为缓冲图像加载:
You can load your image as a buffered image from a URL using:
BufferedImage imm = ImageIO.read(url);
然后将其转换为字节数组:
Then convert it to a byte array with:
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:
Then store the byte array as recommended by this article as a VARBINARY in the database. In your JDBC code, you should wrap the byte array in a ByteArrayInputStream and set the PreparedStatement parameter as a 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():
To get the image out of the database, use ResultStatement.getBlob():
Blob immAsBlob = rs.getBlob();
byte[] immAsBytes = immAsBlob.getBytes(1, (int)immAsBlob.length()));
最后,将字节数组转换为 BufferedImage 并对其进行处理:
Finally, convert the byte array to a BufferedImage and do something with it:
InputStream in = new ByteArrayInputStream(immAsBytes);
BufferedImage imgFromDb = ImageIO.read(in);
相关文章