内容长度上限为 2 GB
Posted
技术标签:
【中文标题】内容长度上限为 2 GB【英文标题】:Content-length is capped to 2 GB 【发布时间】:2011-08-21 10:02:36 【问题描述】:我创建了一个让用户下载文件的脚本:
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】:使用readfile
发送大文件不是好的做法。
使用X-Sendfile
,像这样:header("X-Sendfile: $filename");
。你需要 apache mod_sendfile
。这也应该可以解决您的文件大小问题。
【讨论】:
谢谢你以为这会奏效。但是 X-Sendfile 报告该文件只有 375 MB。 我正在运行 Apache 2.2.17 和 X-Sendfile 0.9-2 ......这就是我的问题。需要最新编译,因为 0.11 增加了对大文件的支持。以上是关于内容长度上限为 2 GB的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 JavaScript 中显示数组元素的上限为 100,有没有办法在没有循环或 splice() 的情况下显示所有内容? [复制]
powershell 此SharePoint PowerShell为SharePoint中的每个内容数据库获取内容数据库大小(以GB为单位)。
用网速为100Mbps的局域网,下载内容为1GB的资料,所需时间为多少?