Файлы ZIP повреждены IE

Я поставляю ZIP-файл в 64-килобайтных порциях, используя цикл в PHP (но проблема может возникнуть с любым языком на стороне сервера).

При загрузке файла с помощью 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

Кто-нибудь знает, откуда взялась эта коррупция?

13.10.2009 12:58:35
как вы определяете эти 64k куски?
Rubens Farias 13.10.2009 13:02:48
3 ОТВЕТА
Content-Encoding: gzip

Вы намеревались сжать свой (уже сжатый) почтовый индекс? Я предполагаю, что ваш веб-сервер добавляет этот заголовок, но если вы добавили его самостоятельно с помощью PHP, то, возможно, это может быть проблемой?

4
13.10.2009 13:07:46
я не добавил этот заголовок самостоятельно. это заголовок, установленный apache.
Pierre Spring 13.10.2009 13:10:24

В этой статье MSDN объясняется, что IIS кодирует ZIP-файлы с использованием gzip, но без надлежащих заголовков он не будет декодировать его перед отправкой в ​​программу разархивирования. Firefox, вероятно, достаточно умен, чтобы автоматически его декодировать. В статье упоминается исправление, хотя в названии статьи не упоминается ваша проблема.

Я бы на всякий случай перепроверил ваши настройки IIS.

1
13.10.2009 13:11:19
извините за то, что не упомянул тот факт, что мы работаем со стеком ламп;) zip-файл генерируется php, а затем отсылается самим php.
Pierre Spring 13.10.2009 13:13:15
Я должен был сделать вывод, что ... Я так долго застрял в мире .NET, что мне нравится немедленно обвинять IIS :)
Cᴏʀʏ 13.10.2009 18:57:35
РЕШЕНИЕ

Благодаря предыдущим ответам мне удалось решить проблему:

Mod_deflate Apache закодировал ответы в gzip. Это имело два эффекта при отправке файла кусками:

  1. Content-LengthЗаголовок не был послан
  2. Доставленные файлы были повреждены при использовании IE7

Решение, в php, состоит в том, чтобы отключить кодирование ответа, используя следующую команду:

apache_setenv('no-gzip', '1');
6
13.10.2009 13:35:16