我尝试使用以下代码使用java.sql.PreparedStatement
到mysql
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
读取器被触发但无法打开文件并发出错误'文件已损坏或文件类型不受支持'
答案 0 :(得分:2)
啊......经过一些调试后,我发现上传的代码很麻烦,最后得到了正确的方法。
这就是我所做的......我发布它以便其他有相同问题的人可以解决它
将java.io.File
转换为java.io.FileInputStream
FileInputStream io = new FileInputStream(inFile);
使用psmnt.setBinaryStream()
psmnt.setBinaryStream(3, (InputStream)io,(int)inFile.length());
答案 1 :(得分:0)
删除“java.sql.Blob blob = rs.getBlob("DOCUMENT");
”
并且不要初始化长度,而不是
int length = (int) blob.length();
写一下
int length;
然后它成功下载文件..享受:)