使用java.sql.PreparedStatement将PDF文件上传到mysql BLOB而不会损坏

时间:2012-06-28 06:09:07

标签: java mysql sql blob prepared-statement

我尝试使用以下代码使用java.sql.PreparedStatementmysql Blob字段来升级pdf文件。

        File inFile = new File("Path+BLOCK.pdf");
        byte[] b = new byte[(int)inFile.length()];

        PreparedStatement psmnt = (PreparedStatement) 
        con.prepareStatement("INSERT  INTO 
                        2012DOC (SRNO,DOCUMENT) 
                       VALUES  (?,?)"
                      );   //con is java.sql.Connection object
        psmnt.setString(1, "1200021");
        psmnt.setBytes(2, b);
        psmnt.executeUpdate();

此代码执行时没有错误,数据库显示blob内容,但是当我尝试使用下面的代码检索文件时,它会提供一个无法打开的损坏文件。

ResultSet rs=con.Execute("SELECT DOCUMENT FROM 2012DOC");
rs.next();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=kjsahkjd.pdf");

java.sql.Blob blob = rs.getBlob("DOCUMENT");
ServletOutputStream servletOutputStream = response.getOutputStream();
InputStream in = blob.getBinaryStream();
int length = (int) blob.length();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
while ((length = in.read(buffer)) != -1) {

servletOutputStream.write(buffer, 0, length);
}
in.close();
servletOutputStream.flush();
servletOutputStream.close();

它输出与原始文件大小相同的文件,但文件无法打开。 pdf读取器被触发但无法打开文件并发出错误'文件已损坏或文件类型不受支持'

2 个答案:

答案 0 :(得分:2)

啊......经过一些调试后,我发现上传的代码很麻烦,最后得到了正确的方法。

这就是我所做的......我发布它以便其他有相同问题的人可以解决它

java.io.File转换为java.io.FileInputStream

之后
FileInputStream io = new FileInputStream(inFile);

使用psmnt.setBinaryStream()

设置BLOB字段
psmnt.setBinaryStream(3,  (InputStream)io,(int)inFile.length());

答案 1 :(得分:0)

删除“java.sql.Blob blob = rs.getBlob("DOCUMENT");

并且不要初始化长度,而不是

int length = (int) blob.length();

写一下

int length;

然后它成功下载文件..享受:)