3

次のコードを使用して、toBlobフィールドを使用java.sql.PreparedStatementしてPDFファイルをアップグレードしようとしました。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.Filejava.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 に答える