2011-10-07 73 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