2009-10-13 230 views
3

我使用PHP中的循环提供64k块中的ZIP文件(但问题会随任何服务器端语言出现)。ZIP文件被IE损坏

当用FF提取文件时,一切都很顺利。

当使用IE7获取文件时,一些位被损坏。这导致错误消息关于错误的CRC(哈希),并且一些解压缩的文件最终被破坏。发送

的标题如下:

Expires: 0 
Cache-Control: must-revalidate, post-check=0, pre-check=0 
Pragma: public 
Content-Description: File Transfer 
Content-Disposition: attachment; filename="671fb8f80f5e94984c59e61c3c91bb70.zip"; 
Content-Transfer-Encoding: binary 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: application/octet-stream 

有没有人有这个地方的腐败来自线索?

+0

您如何定义64k块? – 2009-10-13 13:02:48

回答

6

得益于以前的答案,我设法解决这个问题:

Apache的mod_deflate模块编码gzip的响应。发送以块的文件时,它有两个作用:

  1. Content-Length头没有出动
  2. 交付的文件中使用IE7

解决方案时被损坏,在PHP中是禁用使用以下命令编码响应:

apache_setenv('no-gzip', '1'); 
3
Content-Encoding: gzip 

你打算gzip你的(已经压缩的)zip吗?我假设你的web服务器添加了这个头文件,但是如果你用PHP自己添加它,那么这可能是问题所在?

+0

我没有自己添加这个标题。这是由apache设置的头文件。 – 2009-10-13 13:10:24

1

MSDN article解释说,IIS使用gzip编码ZIP文件,但没有适当的标题,它不会它把它发送到解压程序之前进行解码。 Firefox可能足够智能以自动解码它。文章中提到了一个修复,认为文章标题没有提到你的问题。

我会仔细检查你的IIS设置以防万一。

+0

抱歉没有提的是,我们在灯组工作的事实;)是由PHP生成的ZIP文件,然后用PHP自己发送出去。 – 2009-10-13 13:13:15

+0

我应该推断......我一直停留在.NET世界这么久,我想马上责怪IIS :) – 2009-10-13 18:57:35