ZIP文件被IE损坏

时间:2009-10-13 12:58:35

标签: php apache internet-explorer zip download

我使用PHP循环以64k块提供ZIP文件(但任何服务器端语言都会出现问题)。

使用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

有没有人知道这种腐败来自哪里?

3 个答案:

答案 0 :(得分:6)

由于之前的答案,我设法解决了这个问题:

Apache的 mod_deflate 以gzip编码响应。在以块的形式发送文件时,这会产生两种效果:

  1. Content-Length标题未发送
  2. 使用IE7
  3. 时,已传送的文件已损坏

    在php中,解决方案是使用以下命令禁用响应的编码:

    apache_setenv('no-gzip', '1');
    

答案 1 :(得分:4)

Content-Encoding: gzip

您是否打算对您的(已压缩)拉链进行gzip打印?我假设您的Web服务器添加了此标头,但如果您自己使用PHP添加它,那么这可能是问题吗?

答案 2 :(得分:1)

MSDN article解释说IIS使用gzip对ZIP文件进行编码,但如果没有正确的标头,则在将其发送到解压缩程序之前不会对其进行解码。 Firefox可能足够聪明,可以自动解码它。文章中提到了一个修复,认为文章标题并未完全提及您的问题。

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