所以我使用这个article生成并保护我网站上的一些下载链接
我遇到的问题是脚本有效,而不是大文件。例如,1GB文件下载完美,而7GB文件则不能。
评论中有人提到大量下载可能会导致此问题。
我的标题目前看起来像这样:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($fakefilename) . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($realfilename));
ob_clean();
flush();
readfile($realfilename);
exit;
这guide表明他们看起来应该更像这样:
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
对于我的生活,我无法让它发挥作用。这里的任何人都熟悉HTTP标头,而大而不小的文件无法下载?
感谢任何帮助。提前谢谢!
答案 0 :(得分:1)
此错误是由filesize
调用溢出系统PHP_MAX_INT引起的,该系统产生的长度小于整个文件的长度。 (在32位机器上约为2GB)
只有信任内容长度标题超过文件大小的浏览器才会受到影响。
解决方案是改变
header("Content-Length: " . filesize($file));
到
header("Content-Length: " . exec("stat -c %s ".escapeshellarg($filename)));