使用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;
然后它成功下载文件..享受:)