【问题标题】:Data (BLOB) modifies after insertion to mySql (jsp, servlet)数据 (BLOB) 插入到 mySql (jsp, servlet) 后修改
【发布时间】: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


    【解决方案1】:

    问题是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 ()); 
    

    【讨论】:

    • 感谢您的回复。我不确定我理解什么是“读取”变量?另外,你如何在 line: baos.write(b) 之后使用 baos?而且我认为在上传和检索数据后,MySQL 中的数据仍然会发生变化。如果你能多一点解释我的问题,你刚刚向我展示了我的问题。非常感谢!
    • 我已经为你更新了答案。 available 的问题在于它现在只是 available 的字节数 - 将会有更多数据。而 read 将读取到文件末尾。
    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2012-08-15
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多