2011-02-15 42 views
1

當我嘗試提取zip文件夾,我從服務器強制下載,我得到的消息'沒有文件提取'。但是當我直接從服務器下載zip文件夾時,我能夠正確提取它。這是我用來強制下載的代碼。'沒有文件提取'消息,當試圖提取zip被強制下載時

$file = 'absolute/path/to/the/zip/folder'; 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=".basename($file)); 
header("Content-Description: File Transfer"); 
@readfile($file); 

有誰知道爲什麼會發生這種情況?任何幫助,將不勝感激。在此先感謝

+0

抑制readfile文件中的錯誤可能不明智。 – 2011-02-15 09:04:40

回答

1

我不能回答這個問題,但這裏有一些想法嘗試:

  • 嘗試不同的MIME類型,如通用application/octet-stream
  • 附上Fiddler(或任何其他HTTP調試器)並查看傳輸。你看到了什麼?該文件是否被下載?也許由於某種原因,存在無效的Content-Length標頭?
  • 正如@middaparka在評論中指出的那樣,不要從readfile()中排除錯誤。
+0

我嘗試使用'octet-stream',它沒有幫助找到任何解決方案。正如@middaprka所說,我取消了壓制。沒有幫助。感謝您的回答。 – ksun 2011-02-15 09:56:43

+0

@ksun - 你在菲德勒看到什麼?也許你可以給我們發送保存的「會話」嗎? – 2011-02-15 11:02:43

0

很難判斷它是由於您使用的標題還是服務器問題。但是,我通常使用以下沒有任何問題:

header("Cache-Control: private"); 
header("Content-Type: application/stream"); 
header("Content-Length: ".filesize($file)); 
header("Content-Disposition: attachment; filename=".basename($file)); 

readfile($file); 
exit(); 

因此,您可能想要嘗試上述,看看是否有任何區別。 (猜測,如果你的連接速度很慢,那麼你沒有提供內容長度頭部的事實可能沒有幫助。)

0

謝謝大家的支持。我找到了解決方案。我在發送標題之前使用了mkdir函數。看來這是產生一些錯誤,所以錯誤在標題之前輸出,從而導致問題。當我使用'@'操作符來抑制錯誤時,問題就解決了。 :)。之前,我從fiddler那裏得到了以下消息:「Fiddler在會話#4中檢測到協議違規,服務器沒有正確返回格式化的HTTP頭信息,可能完全丟失(例如HTTP/0.9),可能只有\ r \ r而不是\ r \ n \ r \ n嗎?」