1

所以我使用这篇文章来生成和保护我网站上的一些下载链接

我遇到的问题是脚本可以正常工作,而不是大文件。例如,一个 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;

指南建议它们看起来更像这样:

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 标头并且无法下载大文件而不是小文件?

任何帮助表示赞赏。提前致谢!

4

1 回答 1

1

这个错误是由于filesize调用溢出系统 PHP_MAX_INT 导致的,它产生的长度小于整个文件的长度。(在 32 位机器上大约是 2GB)

只有那些信任 content-length 标头超过文件本身大小的浏览器才会受到影响。

解决方法是改变

header("Content-Length: " . filesize($file));

header("Content-Length: " . exec("stat -c %s ".escapeshellarg($filename)));
于 2013-06-07T21:49:45.390 回答