数据(BLOB)在插入mySql(jsp,servlet)后修改

时间:2014-10-21 01:10:11

标签: java mysql jsp servlets blob

我的问题。 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 []。)谢谢。

1 个答案:

答案 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 ());