【发布时间】:2014-12-16 03:06:39
【问题描述】:
我的问题。 MySQL 更改了我作为 Blob 文件上传到 db 的数据,然后将其取回。所以图像不想出现在我的jsp页面上。
我的程序使用 jsp/servlet 数据源连接到 MySql。
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 类模型。然后我将我的 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());
所以,当我在 Step 2 之后循环遍历 byte[] b 时,我正在获取图像的下一个数据:
-1-40-1-32016747073700120010100-1-3706708667658777998101220131211111225181915202926313029262828323646393234435282840554...
当我在将 Blob 从 MySQL 转换为 byte[] 之后在 第 5 步 的末尾做同样的事情时。我正在获取下一个数据:
10697118971204611511310846114111119115101116461151011141059710846831011141059710866108111986450531025054485653 我在 Inspect Element 中的 Chrome 控制台显示下一个错误: 加载资源失败:net::ERR_CONTENT_LENGTH_MISMATCH 我不会在这里发布一些东西,比如 try/catch 块和设置连接。不想用几十行代码阻碍你。我已经检查过在将 byte[] 转换为 Blob 时数据不会更改,否则在 java 代码中不会更改。所以问题是 MySQL 以某种方式修改数据。
还要提一下我用的是Tomcat服务器。 如果有人帮助我了解问题以及如何解决它,那就太好了。 (我不想将数据存储为巨大的 varchar 或 byte[]。)谢谢。
【问题讨论】:
标签: java mysql jsp servlets blob