我真的不理解字节数组......可能是因为我第一次处理图像所以需要你的帮助
我有base64字符串 R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH 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上也不显示图像
答案 0 :(得分:0)
您需要检查以下内容:
在您的查询“选择图像来自访问”我没有看到WHERE子句来限制结果,所以如果你有很多行,它可能是每次刷新页面时获得不同结果的原因
字段图像是数据库中的BLOB类型吗?
编辑:
检查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 ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==
如果是这种情况,那么您就知道正在进行正确的解码和数据库存储;否则,如果值不同,则需要修复解码或数据库存储代码。