2011-08-21 77 views
2

我創建了一個腳本,讓用戶下載文件:內容長度上限是2 GB

function file_size($filename) 
{ 
    exec('stat -c %s ' . escapeshellarg($filename), $return); 
    return (float)$return[0]; 
} 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=' . basename($filename)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . file_size($filename)); 

readfile($filename); 

exit; 

很簡單。使用file_size函數可以檢測大於2 GB的文件大小。

問題Content-length從來沒有超過2 GB:

< HTTP/1.1 200 OK 
< Date: Sun, 21 Aug 2011 09:33:20 GMT 
< Server: Apache 
< Content-Description: File Transfer 
< Content-Disposition: attachment; filename=very-large-file 
< Content-Transfer-Encoding: binary 
< Expires: 0 
< Cache-Control: must-revalidate, post-check=0, pre-check=0 
< Pragma: public 
< Content-Length: 2147483647 
< Content-Type: application/octet-stream 

上做'Content-Length: ' . file_size($filename)回報string(26) "Content-Length: 4689218232"一個的var_dump。如果我直接訪問該文件沒有一個PHP腳本,沒有任何問題和Apache正在報告正確的文件大小:

< HTTP/1.1 200 OK 
< Date: Sun, 21 Aug 2011 09:58:33 GMT 
< Server: Apache 
< Last-Modified: Thu, 06 Jan 2011 21:56:47 GMT 
< ETag: "8ba8f5e0-1177fcab8-49934940b30e5" 
< Accept-Ranges: bytes 
< Content-Length: 4689218232 

但我真的想通過我的PHP腳本提供服務的文件。感謝您的時間。

回答

3

readfile發送大文件不是好習慣。使用,像這樣:header("X-Sendfile: $filename");。你需要apache mod_sendfile。這也應該解決您的文件大小問題。

+0

謝謝你認爲這是行得通的。但是X-Sendfile報告該文件只有375 MB。 – Znarkus

+0

我btw運行Apache 2.2.17和X-Sendfile 0.9-2 ...這是我的問題。需要編譯最新版本,因爲0.11增加了對大文件的支持。 – Znarkus

+0

..這很容易。再次感謝,它現在可行! – Znarkus