2011-12-08 79 views
4

二進制數據,我試圖壓縮一組二進制數據(從數據庫返回的結果集)到一個單一的文件。可以通過網絡應用程序下載。下面的代碼是用來壓縮結果集,寫的zip文件HttpServletResponse荏苒在Java

String outFilename = "outfile.zip"; 
response.setContentType("application/octet-stream"); 
response.setHeader("Content-Disposition", "attachment; filename= " + outFilename); 
OutputStream os = response.getOutputStream(); 
ZipOutputStream out = new ZipOutputStream(os); 
for (int i = 0; i < cardFileList.size(); i++) { 

    CardFile cardFile = cardFileList.get(i); 
    out.putNextEntry(new ZipEntry(cardFile.getBinaryFileName())); 
    out.write(cardFile.getBinaryFile(), 0, cardFile.getBinaryFile().length); 
    out.closeEntry(); 
} 
// Complete the ZIP file 
out.flush(); 
out.close(); 
os.close(); 

的問題是,雖然用winrar解壓下載的zip文件我得到以下錯誤:

文件路徑:要麼多部分或損壞的ZIP檔案

有人可以指出我在哪裏犯錯?任何幫助,將不勝感激。

[編輯]我想response.setContentType("application/zip");但同樣的結果。

回答

1

下面的代碼工作對我來說:這種代碼生成

FileOutputStream os = new FileOutputStream("out.zip"); 
ZipOutputStream zos = new ZipOutputStream(os); 
try 
{ 
    for (int i = 1; i <= 5; i++) 
    { 
     ZipEntry curEntry = new ZipEntry("file" + i + ".txt"); 
     zos.putNextEntry(curEntry); 
     zos.write(("Good morning " + i).getBytes("UTF-8")); 
    } 
} 
finally 
{ 
    zos.close(); 
} 

Zip文件打開了沒有問題的7-Zip。

  • 檢查來自servlet的響應實際上不是404或500錯誤頁面。選擇一個小的響應,並用十六進制編輯器甚至文本編輯器打開它。 Zip文件以一個'PK'魔數開始,即使在文本編輯器中也應該可見。
  • 嘗試保存到文件,而不是servlet的輸出流對於初學者,看看是否有差別。
  • 難道還有一個過濾器修改你的servlet的輸出/損壞的ZIP?
0

你的代碼看起來生產文件正確。所以這個問題可能在你的下載中。

  1. 看看文件,你已經下載。它的大小是多少?
  2. 試試WinRar以外的工具,看看你有什麼。 7Zip是體面的。