2012-02-03 69 views
-1

我真的不理解字节数组...可能是因为我在处理图像时,第一次如此需要你的帮助从数据库中检索字节组在servlet和JSP中

我的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个的纪录,但每当我执行我的JSP文件,该文件调用servlet类imgData我已经印我的控制台上的每个刷新打印不同的价值和形象是也没有显示在JSP上

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

解码图像可能是图像未正确显示在JSP中的原因。尝试将图像数据直接存储到数据库而不进行解码。 – 2012-02-04 05:39:58

+0

@Ravindra Gullapalli你的意思是说,我应该将图像存储为base64字符串只...这对我来说效率太低.. – 2012-02-04 08:21:34

回答

0

您需要检查以下内容:

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

  2. 战场图像是BLOB类型的数据库?

编辑:

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

与连接器/ J版本3.1.0开始,您可以通过添加属性emulateLocators =忠于你的JDBC URL模仿与 定位器的BLOB。使用这种方法 ,司机将延迟,直到您检索其他数据加载的实际BLOB数据 然后用对BLOB数据流检索方法 (的getInputStream(),getBytes()构造,等等)。

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

SELECT ID,“数据”从blobtable blob_data您也必须遵循 以下规则:

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

的SELECT必须别名原始BLOB列名,指定为 串,到备用名称。

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

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

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

+0

我已经提到只有1行,因为我也用where子句进行了测试,但之后删除除1以外的所有行测试..因此,只有1行和数据类型是BLOB – 2012-02-03 21:19:46

+0

我没有访问表中的主键..你可以告诉我我应该做什么...从你的上述文件现在有什么变化我应该使 – 2012-02-03 21:49:58

+0

你必须创建一个PK,如果你不想使用它们,你可以创建一个带有自动增量功能的“id”列。如果你的数据在生产中,你可以用PK创建一个临时表,然后从旧表加载数据,最后重命名表。 – 2012-02-03 22:01:41

0

你会看到从BLOB数据库中的记录中的最后一个图像文件,因为byat阵列清理一下每一个新的记录,并在更换新的图像文件,以修复位置jsp页面需要将文件写入本地目录,并且需要将路径指向该位置

+0

首先,我只有1条记录在我的数据库..第二我试图fileoutputstream首先保存图像驱动器..有些9字节的文件正在创建,但没有它的图像 – 2012-02-04 12:56:02

0

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

经过相反的过程:
(1)检索字节数组从数据库
(2)不要Base64编码字节数组图像表示
(3)创建从Base64编码字节数组的字符串。

您这样做必须具有相同的价值与原中得到的字符串: R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN​​48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==

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

相关问题