【茶包射手專欄】探索ZIP下載破損問題
4 |
CHE反應我的中文編碼解析工具 Ver 1.3下載後無法解壓縮。
做了些測試歸納出以下結果:
- 同樣的檔案內容,由備用站台blog2.darkthread.net下載就一切正常。
- 下載PDF等檔案沒有問題,但ZIP檔全倒。(ZIP檔走備用站台也OK)
- 我另外上傳了ZIP檔,不經過Community Server的檔案機制,下載則沒有問題。
- 更驚訝的下載ZIP破損問題讓IE6, IE7, IE8全倒,但Firefox、Chrome、Safari、Opera都OK。
於是我決定做些實驗,找出其中的祕密。先上傳一個Test.txt壓成Test.zip,再分別由主站、備站的同一URL下載ZIP檔案,發現二者內容完全不同。
接著我開啟HttpWatch,觀察二者及以直接以HTTP下載Test.zip的傳輸異同,這下就看出差別來了。
爛掉的ZIP檔下載時被開啟了GZip壓縮(應是IIS的HTTP壓縮功能,可以參考保哥的加速前端網頁效能的14條規則的第4點),見Stream Tab右邊,出現了Content-Encoding: gzip。
解壓後的Conent看來很正常:
備站下載時沒有開啟GZip壓縮:
直接下載檔案時也沒有開啟GZip壓縮:
由這些結果來看,我的推論如下:
- 主站台被設定了HTTP壓縮功能(但對靜態檔案未開啟壓縮),當檔案透過ASP.NET程式下載時,啟用了GZip壓縮。(實際設定要再向Web Hosting廠商求證)
這可以解釋同一站台下載同一檔案: HTTP GET OK,透過ASPX下載卻有問題。 - 備用站台未開HTTP壓縮,故無此問題。
- IE在處理GZip壓縮過的ZIP檔時有問題,導致存檔內容錯亂。我認為這是IE的Bug,理由是: 其他的瀏覽器均無此問題,而且HttpWatch也能正確還原(見先前解壓Content一圖)
這問題我會向Web Hosting廠商詢問看看,並提報問題給MS,若有後續消息再向各位報告。在此之前,大家如果需要由本站下載ZIP,請先用非IE瀏覽器。
Comments
# by CHE
Jeffrey 兄你好, 昨天我這邊測試的結果,解壓縮出來的那個檔案, 雖然EncAnalyzer131 沒有副檔名,但是我把那個檔案改名成有副檔名-->EncAnalyzer131.RAR 或 .ZIP,再解一次就可以發現 EncodingAnalyzer.exe 和 EncodingAnalyzer.pdb 兩個檔案了
# by tim
應該是 ie 的有趣 bug. 他在 gzip 壓縮下的 zip 會不把第一層解開, 保留著 gzip 的壓縮, 可以參考下面連結: http://www.waltercedric.com/joomla-mainmenu-247/281-news/1124-download-issues-on-my-homepage-zip-files-corrupt.html http://www.talis.com/tdn/node/1819 真的將該檔名加上.gz 後, 如 EncAnalyzer131.zip.gz 就可以解開兩次取得正確的內容了, 所以解決方式就會變成: 1. ie bug fix (不知有沒有) 2. 對 zip 檔不要壓縮 (不過目前是透過 aspx 輸出壓縮的關係) 3. user 不用 ie 4. 用 ie 下載的檔案多加 .gz 這層殼......
# by 小桶子
如果遇到 直接用winrar的修覆有用嗎??
# by wcchien
我以前在 IIS6 上 enable GZIP, 執行 Moodle 系統(PHP) 曾發生同樣問題, 後來參考 http://support.microsoft.com/kb/841120/en-us To work around this problem, change the MIME type for the .ZIP file from application/x-zip-compressed to application/octet-stream. To change the MIME type, follow these steps: Click Start, point to Administrative Tools, and then click Internet Information Services (IIS) Manager. Right-click the server (local computer) tree, where server (local computer) is the name of your IIS server, and then click Properties. Click MIME Types. Scroll down the registered MIME type list to find the .zip entry. Click the .zip application/x-zip-compressed entry, and then click Edit. Change the MIME type value to application/octet-stream. Stop and then restart the IIS Admin Service to apply the change to the MIME type. 才解決問題, 以上建議參考一下