在servlet和jsp中从数据库中检索bytearray

时间:2012-02-03 20:59:03

标签: java image jsp java-ee

我真的不理解字节数组......可能是因为我第一次处理图像所以需要你的帮助

我有base64字符串 R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN​​48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==

我正在解码并将其存储在MySql数据库中然后我在我的servlet端使用以下代码

if ( request.getParameter("imgID") != null )
    {

      iNumPhoto = Integer.parseInt(request.getParameter("imgID")) ;   


      try
      {  
                Class.forName("com.mysql.jdbc.Driver").newInstance();
               conn=DriverManager.getConnection("jdbc:mysql://localhost:9191/mbcss","root","admin");
               stmt= conn.createStatement();

         //conn.setAutoCommit (false);  

         // get the image from the database
         byte[] imgData = GetPhoto.getPhoto( conn, iNumPhoto );   
         System.out.println("imgData="+imgData);
         // display the image
         response.setContentType("image/gif");
         OutputStream o = response.getOutputStream();
         o.write(imgData);

         o.flush(); 
         o.close();
      }
      catch (Exception e)
      {
        e.printStackTrace();

      }
    }
         }

这里是getPhoto方法

public static byte[] getPhoto (Connection conn, int iNumPhoto)
throws Exception, SQLException
{
 String req = "" ;
 Blob img ;
 byte[] imgData = null ;
 Statement stmt = conn.createStatement ();

 // Query
 req = "Select image From visit";

 ResultSet rset  = stmt.executeQuery ( req ); 

 while (rset.next ())
 {    
  img = rset.getBlob(1);
  imgData = img.getBytes(1,(int)img.length());
 }    

 rset.close();
stmt.close();

 return imgData ;
}

访问表只有1条记录,但每当我执行调用我在控制台上打印的servlet类 imgData 的jsp文件时,每次刷新都会打印不同的值,而JSP上也不显示图像

  1. 每次显示不同的值是编码错误或字节数组的特征。
  2. 为什么图像不显示帮助我

3 个答案:

答案 0 :(得分:0)

您需要检查以下内容:

  1. 在您的查询“选择图像来自访问”我没有看到WHERE子句来限制结果,所以如果你有很多行,它可能是每次刷新页面时获得不同结果的原因

  2. 字段图像是数据库中的BLOB类型吗?

  3. 编辑:

    检查MySQL的文档,您需要遵循一些规则。首先,该方法必须是getBytes而不是getBlob。其他规则是:

      

    从Connector / J 3.1.0版开始,您可以使用模拟BLOB   定位器通过将属性emulateLocators = true添加到JDBC URL。   使用此方法,驱动程序将延迟加载实际的BLOB数据   直到您检索其他数据,然后使用检索方法   (blon数据流上的getInputStream(),getBytes()等)。

         

    您必须使用列别名,并将列的值与实际值相对应   BLOB的名称,例如:

         

    选择id,'data'作为blobtable的blob_data您还必须遵循   这些规则:

         

    SELECT必须仅引用一个表。该表必须有一个   主键。

         

    SELECT必须将原始blob列名称别名,指定为a   字符串,替代名称。

         

    SELECT必须涵盖构成主键的所有列。

         

    BLOB实现不允许就地修改(它们是   由DatabaseMetaData.locatorsUpdateCopies()报告的副本   方法)。因此,请使用相应的   PreparedStatement.setBlob()或ResultSet.updateBlob()(在。的情况下)   可更新的结果集)将更改保存回数据库的方法。

    您可以访问以下网址查看更多信息:http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html

答案 1 :(得分:0)

你会看到来自blob数据库记录的最后一个图像文件,因为byat数组将每个新记录刷新出来并将新图像文件替换为jsp页面中的修复位置,你需要将文件写入本地目录并且需要给出该位置的路径

答案 2 :(得分:0)

您需要确保正确解码Base64编码图像,并确保将图像添加到数据库的代码没有问题。

完成相反的过程:
(1)从数据库中检索字节数组图像表示
(2)对字节数组进行Base64编码 (3)从Base64编码的字节数组中创建一个String。

这样做的字符串必须与原始字符串具有相同的值: R0lGODlhDwAPAKECAAAAZMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN​​48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==

如果是这种情况,那么您就知道正在进行正确的解码和数据库存储;否则,如果值不同,则需要修复解码或数据库存储代码。

相关问题