我创建了一个允许用户下载文件的脚本:
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)
上执行var_dump会返回string(26) "Content-Length: 4689218232"
。如果我在没有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脚本来提供文件。谢谢你的时间。
答案 0 :(得分:3)
使用readfile
发送大型文件并不是一种好习惯。
使用X-Sendfile
,如下所示:header("X-Sendfile: $filename");
。你需要apache mod_sendfile
。这也应解决您的文件大小问题。