我的问题。 MySQL将我上传到db的数据更改为Blob文件,然后将其检索回来。因此,图像不希望出现在我的jsp页面上。
我的程序使用与MySql的jsp / servlet数据源连接。
dataSource = ConnectionUtil.getMySQLDataSource();
Connection与我程序中的所有其他表完美配合。
第1步。 当我尝试使用jsp上传图像时出现问题...
<form method="POST" enctype="multipart/form-data" action="Image">
File to upload: <input type="file" name="upfile"><br/>
<br/>
<input type="submit" value="Press"> to upload the file!
</form>
第2步。 ...并通过将请求传递给InputStream将其发送到doPost方法。然后我只是将inputStream读入byte []。并将 byte [] 转换为 java.sql.Blob 类型。
for (Part part : request.getParts()) {
InputStream is = request.getPart(part.getName()).getInputStream();
int i = is.available();
HttpSession session = request.getSession();
if (i > 0) {
byte[] b = new byte[i + 1];
is.read(b);
}
}
第3步。 在完成所有这些步骤之后,我将MySql连接发送到我的java类Model。然后我将我的byte [] b文件转换为Blob文件。
Blob image = new SerialBlob(b);
第4步。
并使用PreparedStatement将此数据(以及更多内容)发送到MySql数据库,并将其存储为MEDIUMBLOB
。
String strPsInsertPic = "INSERT INTO `pics`(picid,image, imagelength, name) " +
"VALUES ('" + (picid) + "','" + image + "','" + image_length + "','" + name + "')";
psInsertPic = conn.prepareStatement(strPsInsertPic);
psInsertPic.executeUpdate();
此外,我正在关闭Connection和PreparedStatement。
第5步。 在另一个jsp页面上,我将转到我的servlet中的doGet方法(当然设置与DB的连接)并在那里创建语句以将图像作为Blob。并将其转换为byte []。
preparedStatement = conn.prepareStatement("SELECT image,imagelength,type FROM pics WHERE picid ='" + picid + "'");
resultSet = preparedStatement.executeQuery();
bImage = rs.getBlob("image");
byte[] bdata = bImage.getBytes(1, (int) bImage.length());
所以,当我在第2步之后循环遍历 byte [] b 时,我会获得我的图片的下一个数据: -1-40-1-32016747073700120010100-1-37067086676587779981012201312111112251819152029263130292628283236463932344435282840554 ...(那里有很多数字)
在将Blob从MySQL转换为byte []之后,当我在第5步结束时做同样的事情时。我正在获取下一个数据: 10697118971204611511310846114111119115101116461151011141059710846831011141059710866108111986450531025054485653
Inspect Element中的我的Chrome控制台显示下一个错误:
无法加载资源:net :: ERR_CONTENT_LENGTH_MISMATCH
我不是在这里发布一些像try / catch块和设置连接的东西。不想用几十行代码阻塞你。我已经检查过将byte []转换为Blob以及java代码中的数据不会更改。所以问题是MySQL以某种方式修改数据。 还要提一下我正在使用Tomcat服务器。
如果有人帮助我理解问题以及如何解决问题,那会很棒。 (我不想将数据存储为巨大的varchar或byte []。)谢谢。
答案 0 :(得分:0)
问题是available
不是文件大小的良好指标。
尝试
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte b [] = new byte [1024];
int read = 0;
while ((read = is.read(b)) != -1) {
// add b to baos
baos.write(b);
}
Blob image = new SerialBlob(baos.toByteArray ());