在servlet和jsp中从数据库检索字节数组



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

我有base64字符串R0lGODlhDwAPAKECAAAAzMzM///wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBbGVhZCBTbWFydFNhdmVyQAAOw==

我正在解码并将其存储在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类的jsp文件时,我在控制台上打印的imgData都会在每次刷新时打印不同的值,并且图像也不会显示在jsp 上

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

您需要检查以下内容:

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

  2. 字段图像在数据库中属于BLOB类型?

编辑:

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

从Connector/J 3.1.0版本开始,您可以使用locators,方法是将属性emulateLocators=true添加到JDBC URL中。使用此方法,驱动程序将延迟加载实际BLOB数据直到检索到其他数据,然后使用检索方法(getInputStream()、getBytes()等)。

您必须使用列别名,该列的值与实际值BLOB的名称,例如:

SELECT id,"data"作为blobtable中的blob_data您还必须遵循这些规则:

SELECT只能引用一个表。该表必须具有主键。

SELECT必须将指定为字符串,转换为备用名称。

SELECT必须覆盖组成主键的所有列。

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

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

您将从blob数据库中看到记录中的最后一个图像文件,因为byat数组会刷新每个新记录,并将新图像文件替换到jsp页面中的固定位置。您需要将文件写入本地目录,并需要提供该位置的路径

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

执行相反的过程:
(1) 从数据库中检索字节数组图像表示
(2) 对字节数组执行Base64编码
(3) 从Base64编码的字节数组创建字符串

通过执行此操作获得的字符串必须与原始字符串具有相同的值:R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyQAAOw==

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

最新更新