我真的不了解字节数组。。。可能是因为我第一次处理图像,所以需要你的帮助
我有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 上
- 每次显示不同的值是编码错误或字节数组的特性
- 为什么不显示图像帮助我
您需要检查以下内容:
-
在您的查询"从访问中选择图像"中,我没有看到限制结果的WHERE子句,所以如果您有很多行,这可能是每次刷新页面时获得不同结果的原因。
-
字段图像在数据库中属于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==
如果是这样的话,那么你就知道你正在正确地进行解码和数据库存储;否则,如果值不同,则需要修复解码或数据库存储代码。