2010-04-12 129 views
2

我目前遇到用戶下載存儲在我的服務器上的文件的一些問題。一旦用戶點擊下載按鈕,我將代碼設置爲自動下載文件。它適用於所有文件,但當文件大小超過30 MB時會出現問題。用戶下載是否有限制?另外,我提供了我的示例代碼,並且想知道是否有比使用PHP函數'file_get_contents'更好的做法。PHP文件下載問題

謝謝大家的幫助!

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/'; 
$filename = 'filename.zip'; 
$filesize = filesize($path . $filename); 
@header("Content-type: application/zip"); 
@header("Content-Disposition: attachment; filename=$filename"); 
@header("Content-Length: $filesize") 
echo file_get_contents($path . $filename); 
+1

我不是PHP專家,但是你嘗試過增加了腳本內存限制。 – 2010-04-12 17:36:19

回答

1

file_get_contents()將文件內容拉到PHP虛擬機中。使用readfile()流式傳輸文件而不讀取它。

6

file_get_contents()會將整個文件加載到內存中 - 使用它的日誌。

而在PHP中,腳本可以使用的內存量有限(請參閱memory_limit - 這可能會解釋您的下載腳本不適用於大文件。


使用readfile()可能是更好的選擇:它會讀取文件並直接將其內容發送到輸出緩衝區。

這意味着:

  • 不加載整個文件到內存
  • 不必附和你的內存已經加載的內容。

就使用這樣的事情應該是OK:

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/'; 
$filename = 'filename.zip'; 
$filesize = filesize($path . $filename); 
@header("Content-type: application/zip"); 
@header("Content-Disposition: attachment; filename=$filename"); 
@header("Content-Length: $filesize") 
readfile($path . $filename); 


(順便說一句:你真的想保持沉默的錯誤這種方式,與@運營商的另一種解決方案是不顯示他們,但他們記錄到一個文件 - 見display_errorslog_errorserror_log

+0

帕斯卡爾,感謝您的幫助和很好的信息。看起來像我的腳本限制足夠大,readfile函數工作正常。我刪除了@運算符以重新打開錯誤。雖然,我仍然遇到我的大文件下載問題。還有什麼想法? – nsearle 2010-04-12 18:09:17