内容长度限制为2 GB

时间:2011-08-21 10:02:36

标签: php download filesize

我创建了一个允许用户下载文件的脚本:

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脚本来提供文件。谢谢你的时间。

1 个答案:

答案 0 :(得分:3)

使用readfile发送大型文件并不是一种好习惯。

使用X-Sendfile,如下所示:header("X-Sendfile: $filename");。你需要apache mod_sendfile。这也应解决您的文件大小问题。