使用纯JDBC从DB检索映像时修改的Blob信息

时间:2014-09-08 09:58:21

标签: java image-processing jdbc db2 blob

我正在开发一个小型POC(将集成到更大的应用程序中),其中包含

问题背景

  1. 在简单的Java应用程序中读取图像,
  2. 将图像转换为字节数组byte[] imageEncodedBytes = baos.toByteArray()
  3. 将其存储到远程DB2数据库中(使用的技术不是imp,所以我现在使用普通的jdbc)
  4. 从数据库中读回来
  5. 将其转换回来以确保重新创建图像。 (我可以在任何图像查看器中打开新重新创建的图像)
  6. 问题

    问题发生在第5步。

    1. 我使用选择查询将图像读入结果集。
    2. 使用rs.getBlob("ColumnName")获取blob值。
    3. 使用byte[] decodedArray = myBlob.getBytes(1, (int)myBlob.length())
    4. 从blob值中获取字节数组
    5. 从获取的字节数组中创建图像。
    6. 在步骤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+"')")
      
      1. 作为从结果集中获取blob值的替代方法,我还使用binaryStream = rs.getBinaryStream("PHOTO_IM")来获取二进制流,然后从二进制流中获取字节数组。即使在这种情况下,decodingArray也不同于imageEncodedBytes
      2. 请帮助,我可能会遗漏一些非常微不足道的东西,但我无法弄清楚是什么。任何帮助/指针都会非常有帮助。提前致谢。

1 个答案:

答案 0 :(得分:0)

这个决议是我一直在努力解决的问题。

我使用了jdbcTemplates来解决这个问题。 jdbc模板的lobHandler对象提供了一种管理blob的简便方法。

使用Spring Lob Handler解决的步骤

  1. )创建了数据源
  2. )将Jdbc模板配置为使用数据源
  3. )使用lobHandler代码执行插入查询
  4. 以下代码

     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