2009-10-13 180 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