2011-10-07 77 views
0

我生成一個包含文本和圖像文件組合的zip文件,這在一臺計算機上正常工作,但在另一臺計算機上,我的圖像文件已損壞(相同的Java版本和操作系統);由此產生的文件大小是相同的,但圖像不會在圖像編輯器/查看器中打開,文本文件很好。爲什麼圖像在我的zip文件中被損壞?

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ZipOutputStream zos = new ZipOutputStream(bos); 
zos.setMethod(ZipOutputStream.DEFLATED); 
addZipEntry(zos, "/forms/images/calendar.gif", "images/calendar.gif"); 
addZipEntry(zos, "/forms/templ/header.php", "templ/header.php"); 
zos.close(); 

private void addZipEntry(ZipOutputStream zos, String resourcePath, String entryName) throws IOException { 
    ClassLoader cl = getClass().getClassLoader(); 
    InputStream is = cl.getResourceAsStream(resourcePath); 
    zos.putNextEntry(new ZipEntry(entryName)); 
    zos.write(IOUtils.toByteArray(is)); 
    zos.closeEntry(); 
} 

任何想法爲什麼圖像被損壞?

Here's a visual binary comparison between a corrupt image and the original.

+1

我建議你創建一個更小的例子來說明問題(排除對ClassLoaders和東西的引用),也許還會上傳造成麻煩的圖像。 – aioobe

+2

在圖像上運行diff工具以確切瞭解數據的變化情況。 – Stijn

+0

@Stijn我已經添加了一個視覺比較的鏈接,它並沒有真正告訴我很多個人,但也許有人更開明可以看到發生了什麼。 – Phill

回答

2

看來你用來提取你的ZIP文件的工具將你的圖像當作ASCII文本對待,將高於或等於0x80的任何值替換爲未知字符,用問號(0x3F)代替它。

+0

在閱讀您對EJP的回答的評論後進行編輯。 – Stijn

+0

我使用相同的工具來提取工作拉鍊上的圖像,我也嘗試了不同的提取工具。 – Phill

+0

你是否有機會使用FTP傳輸ZIP文件? – Stijn

0

爲什麼圖像越來越損壞任何想法?

這將取決於IOUtils.toByteArray(is)做什麼。

+0

這是我的第一個直覺,我試着把IOUtils拿出來,我仍然有同樣的問題。 – Phill

+0

@Phill用什麼取代它? – EJP

+0

'byte [] buf = new byte [1024]; int len; ((len = is.read(buf))> 0){ zos.write(buf,0,len); }' – Phill