【发布时间】:2015-05-29 13:20:36
【问题描述】:
我必须通过我的 Apache2/PHP 服务器向某些人分发一个巨大的文件(舞会的图片),这让我有些头疼:Chrome 和 Firefox 都显示文件大小为 2GB,但文件实际上 >4GB,所以我开始追查事情。 我在我的 php 脚本中执行以下操作:
header("Content-Length: ".filesize_large($fn));
header("Actual-File-Size: ".filesize_large($fn)); //Debug
readfile($fn);
filesize_large() 将 >4gb 文件的正确文件大小作为字符串返回(是的,即使在 32 位 PHP 上也是如此)。
现在是有趣的部分;实际的 HTTP 标头:
Content-Length: 2147483647
Actual-File-Size: 4236525700
所以filesize_large() 方法工作得很好,但是 PHP 或 Apache 以某种方式限制了 Content-Length 的值?!为什么会这样?
Apache/2.2.22 x86,PHP 5.3.10 x86,我在 https 上使用 SSL
当我说filesize_large() 是正确的时候你们相信我:
function filesize_large($filename)
{
return trim(shell_exec('stat -c %s '.escapeshellarg($filename)));
}
编辑:
似乎 PHP 在 32 位系统上通过 sapi 接口与 apache2 通信时将内容长度转换为整数。遗憾的是,没有解决方法,除非在文件 >2GB 的情况下不包括 Content-Size
解决方法(实际上是一个更好的解决方案):使用 mod_xsendfile
【问题讨论】:
-
你能发布你的完整代码吗?尤其。
filesize_large()的代码 -
“即使在 32 位 PHP 上”也是你的问题。这仍然会是一个问题。您是否尝试过不发送标头?
-
当我不发送标题时,Chrome 和 Firefox 没有关于文件大小的信息,他们只是开始愉快地下载。
-
是的,我认为这是您唯一真正的解决方案,除非您可以更改为 64 位或拆分文件。
-
找到这个,好像很像stackoverflow.com/q/6748471/1301076