2012-09-17 33 views
2

我在網頁上做了以下操作:單擊元素將一組數據(附加到元素)發送到我的服務器,然後生成一個自定義zip文件:儘管文件大小存在於標題中,但下載文件大小未知

$.post(urlprefix + 'makeZip.php', params, function(data){ 
    window.location = urlprefix + 'getZip.php?file=' + data; //get file 
}).error(handleAJAXError); 

makeZip.php作品只是罰款,並返回(臨時)zip文件,客戶端應該然後下載的名稱。當我想保持我的服務器乾淨我的路線文件通過稱爲getZip.php另一個腳本執行以下操作:

/* RETURN REQUESTED FILE AND DELETE FROM SERVER*/ 
$filename = $_GET['file']; 
/* TRANSFER FILE CONTENTS */ 
header('Content-type: application/zip'); 
header('Content-Disposition: attachment; filename="customDownload.zip"'); 
header('Content-Length: '.filesize($filename)); 
readfile($filename); 
/* REMOVE FILE FROM SERVER */ 
unlink($filename); 

所有的瀏覽器將成功地下載文件,但我現在面臨一個問題:文件可以得到相當大(高達200MB),所以我認爲能夠估計下載需要多長時間會很好。這就是爲什麼我發送Content-Length標題(指定的文件大小是正確的)。然而,我測試過的所有瀏覽器都告訴我文件大小未知(這可能會導致用戶跳過下載)。

這是我的標題信息的某種問題嗎?這是客戶端問題嗎?我應該使用另一種方法讓客戶端下載文件嗎?

+1

你能不能檢查與提琴手或類似的瀏覽器不首先執行'HEAD'請求獲取文件大小?如果是這樣,您可能需要在獲得該請求時返回相同的信息。 –

回答

5

如果通過下載提供ReadFile的文件時,在客戶端顯示的對話框中的「未知文件大小」,你最好檢查是否mod_deflatemod_gzipmod_something-that-shrinks-http已安裝在服務器上,並把異常給定下載。

更多信息here

編輯由M90:

在我的具體情況(運行A​​pache),我轉身用收縮關:

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 

文件大小頭被髮送,現在在所有瀏覽器中都能正確收到

+0

似乎是問題的原因:我使用了@apache_setenv('no-gzip',1); @ini_set('zlib.output_compression',0);'在我的腳本中(不能在服務器範圍內)並且現在工作得很好。謝謝! – m90

+0

@ m90:太棒了,很高興知道它適合你! – rkosegi

+0

@ m90 - 最好是添加自己的答案,而不是實質性地改變別人的答案。那麼誰寫了什麼就更清楚了,而不必檢查以前的版本':)'。 – halfer