我正在开发一个小型POC(将集成到更大的应用程序中),其中包含
问题背景
byte[] imageEncodedBytes = baos.toByteArray()
问题
问题发生在第5步。
rs.getBlob("ColumnName")
获取blob值。 byte[] decodedArray = myBlob.getBytes(1, (int)myBlob.length())
在步骤3中,从blob获得的字节数组decodedArray
不同于字节数组' imageEncodedBytes'当我读到图像时,我得到了
因此,以下用于从字节数组decodedArray
创建映像的代码失败。
ByteArrayInputStream bais = new ByteArrayInputStream(decodedArray);
//Writing to image
BufferedImage imag=ImageIO.read(bais); // Line of failure. No registered provider able to read bais
ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg"));
问题调查的参考资料和其他数据
我已提及以下链接进行验证
1. Inserting image in DB2
2. This Link here提供了洞察力,但我无法确定如何注册ImageReader
。
4.将图像插入DB2时我正在使用 - 以下查询
Statement st = conn.createStatement();
st.executeUpdate("INSERT INTO PHOTO (ID,PHOTO_NM,PHOTO_IM, THMBNL_IM) " + "VALUES (1,'blob("+bl+")',blob('"+bl+"')")
binaryStream = rs.getBinaryStream("PHOTO_IM")
来获取二进制流,然后从二进制流中获取字节数组。即使在这种情况下,decodingArray也不同于imageEncodedBytes 请帮助,我可能会遗漏一些非常微不足道的东西,但我无法弄清楚是什么。任何帮助/指针都会非常有帮助。提前致谢。
答案 0 :(得分:0)
这个决议是我一直在努力解决的问题。
我使用了jdbcTemplates来解决这个问题。 jdbc模板的lobHandler对象提供了一种管理blob的简便方法。
使用Spring Lob Handler解决的步骤
以下代码
jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute("INSERT INTO PHOTO (PHOTO_IM) VALUES (?)",
new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
protected void setValues(PreparedStatement ps, LobCreator lobCreator) {
try {
lobCreator.setBlobAsBinaryStream(ps, 1, bean.getImageOrig(), bean.getImageLength());
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}
}
);
的引用 1.)Stack Overflow Link - Spring JDBC Template Insert Blob 2.)Stack Overflow Link - Close InputStream 3.)Spring Doc for LobHandler