2012-06-28 45 views
2

我嘗試使用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閱讀器被解僱,但無法打開文件,並給出錯誤「該文件已損壞或不支持文件類型」

+0

我也有這樣那樣的問題。你能指定*不打開*嗎? PDF閱讀器被解僱但無法顯示文件?或者瀏覽器不能結束下載? – Raffaele

+0

PDF閱讀器被解僱但無法打開文件。讀者給出錯誤「該文件已損壞或不支持文件類型」 –

+0

沒有可重複的測試用例,我們只能嘗試猜測以減少問題。我認爲你的第一次嘗試應該是比較原始文件和數據庫內容,看看它們是否真的是二進制平等的。驅動程序是官方的MySQL Connector/J,不是嗎? – Raffaele

回答

2

啊......經過一些調試後,我發現上傳的代碼很麻煩,最後有正確的方式來做到這一點。

這裏是我做過什麼......我張貼,讓其他人有同樣的問題,能解決它

轉換使用psmnt.setBinaryStream()

java.io.Filejava.io.FileInputStream

FileInputStream io = new FileInputStream(inFile); 

設置BLOB字段後

psmnt.setBinaryStream(3, (InputStream)io,(int)inFile.length()); 
0

刪除 「java.sql.Blob blob = rs.getBlob("DOCUMENT");

不初始化長度即代替

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

只寫

int length; 

然後下載文件成功..享受:)