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

我尝试使用以下代码使用java.sql.PreparedStatement将pdf文件升级为mysql Blob字段。

  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阅读器被触发但无法打开文件并发出错误’文件已损坏或文件类型不受支持’

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

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

java.io.File转换为java.io.File之后

 FileInputStream io = new FileInputStream(inFile); 

使用psmnt.setBinaryStream()设置BLOB字段

 psmnt.setBinaryStream(3, (InputStream)io,(int)inFile.length()); 

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

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

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

写吧

 int length; 

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