3

我尝试使用以下代码将 pdf 文件上传java.sql.PreparedStatement到Blob 字段。mysql

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

4

2 回答 2

3

啊……经过一点调试,发现上传的代码很麻烦,终于找到了正确的方法。

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

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

FileInputStream io = new FileInputStream(inFile);

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

psmnt.setBinaryStream(3,  (InputStream)io,(int)inFile.length());
于 2012-06-28T09:23:55.033 回答
0

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

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

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

写吧

int length;

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

于 2013-07-11T06:57:34.817 回答