使用java.sql.PreparedStatement将PDF文件上传到mysql BLOB,无损坏

使用java.sql.PreparedStatement将PDF文件上传到mysql BLOB,无损坏,java,mysql,sql,blob,prepared-statement,Java,Mysql,Sql,Blob,Prepared Statement,我尝试使用以下代码将一个pdf文件使用java.sql.PreparedStatement上传到mysqlBlob字段 File inFile = new File("Path+BLOCK.pdf"); byte[] b = new byte[(int)inFile.length()]; PreparedStatement psmnt = (PreparedStatement) con.prepareStatement("INS

我尝试使用以下代码将一个pdf文件使用
java.sql.PreparedStatement
上传到
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
阅读器已启动,但无法打开文件,并给出错误“文件已损坏或不支持文件类型”

Ahhh…经过一点调试,我发现上载的代码很麻烦,最终找到了正确的方法

以下是我所做的…我发布它是为了让其他有同样问题的人能够解决它

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

FileInputStream io = new FileInputStream(inFile);
使用
psmnt.setBinaryStream()设置BLOB字段

删除“
java.sql.Blob Blob=rs.getBlob(“文档”);

并且不要初始化长度,即代替

int length = (int) blob.length();
只要写

int length;

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

我也有这种问题。你能指定不打开吗?PDF阅读器已启动,但无法显示文件?或者浏览器没有结束下载?pdf阅读器已启动,但无法打开文件。读者给出了一个错误“文件已损坏或不支持文件类型”,如果没有可复制的测试用例,我们只能尝试猜测以减少问题。我认为您的第一次尝试应该是比较原始文件和数据库内容,看看它们是否真的是二进制相等的。驱动程序是官方的MySQL连接器/J,不是吗?另外,与其在内存中读取文件内容,不如使用
PreparedStatement.setBlob(int,InputStream)
。根据文档,
setBytes
使用
(LONG)VARBINARY
@Raffaele,我找到了一种方法,使用
setBinaryStream
。。。张贴答案供他人参考。
int length;