内容长度上限为 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的资料,所需时间为多少?

如何传递大文件(GB级别)

用return来做题:检查列表的长度,如果大于2,那么仅仅保留前两个长度的内容,并将新内容打印

Day909.MySQL 不同的自增 id 达到上限以后的行为 -MySQL实战