2012-03-06 70 views
0

這裏zip文件在內存中,我使用創建一個zip文件的代碼:錯誤使用Java創建

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ZipOutputStream out = new ZipOutputStream(baos); 
try { 
    for(int i=0; i<docId.length; i++){ 
     BoxDotComDocumentManager docman = new BoxDotComDocumentManager(); 
     Document d = docman.get(docId[i]); 
     ZipEntry entry = new ZipEntry(d.getFileName()); 
     entry.setSize(d.getFileBytes().length); 
     out.putNextEntry(entry); 
     out.write(d.getFileBytes()); 
     resp.setContentType("application/zip"); 
     resp.setHeader("Content-Disposition", "attachment; filename="+ "zipdemo.zip"); 
     out.closeEntry(); 
} 
} catch (Exception e) { 
     System.out.println("E = " + e); 
} 
try { 
     resp.getOutputStream().write(baos.toByteArray()); 
    resp.flushBuffer(); 
} catch (IOException e) { 
    e.printStackTrace(); 
    } 
finally { 
baos.close(); 
out.close(); 
} 

zip文件被返回給瀏覽器被下載,但是當我嘗試下載文件我收到一個錯誤,指出文件無法下載,因爲zip文件無效。

文檔是一個對象,其中包含有關包含實際文件的文件的所有信息。

任何想法,我做錯了什麼?我已經嘗試了很多這樣的排列,他們都沒有工作。先謝謝你。

Keith

+0

首先:當您遇到致命錯誤時,*不要*只打印堆棧跟蹤。使請求失敗。另外,不要光禿禿的Exceptino - 它幾乎總是錯誤的方法。哦,你爲什麼要在循環的每次迭代中設置標題? – 2012-03-06 23:00:19

+0

喬恩 - 試圖做一個快樂的小路工作,然後我會妥善處理所有的異常,與標題相同的東西;讓他們在循環或外部不會改變錯誤。他們將被移出循環。 – 2012-03-06 23:06:36

+1

但它使你很容易錯失異常。國際海事組織,它是值得的異常處理權*首先*,以便您可以告訴你什麼時候真正經歷了快樂的道路... – 2012-03-06 23:08:04

回答

2

嘗試使用3個參數的out.write方法。

替換: out.write(d.getFileBytes());

有了: out.write(d.getFileBytes(),0,d.getFileBytes().length);


注:根據Java doc中的一個參數的write方法不會被讀取。

將b.length個字節寫入此輸出流。

FilterOutputStream的寫入方法使用參數b,0和b.length調用其三個參數 的寫入方法。

請注意,此方法不會使用單參數b調用其基礎流的單參數寫入方法 。

在我自己的代碼中進行此更改可以解決我的問題。