2

我目前在用户下载存储在我的服务器上的文件时遇到了一些问题。一旦用户点击下载按钮,我将代码设置为自动下载文件。它适用于所有文件,但是当大小大于 30 MB 时就会出现问题。用户下载有限制吗?另外,我提供了我的示例代码,我想知道是否有比使用 PHP 函数“file_get_contents”更好的做法。

谢谢大家的帮助!

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/';
$filename = 'filename.zip';
$filesize = filesize($path . $filename);
@header("Content-type: application/zip");
@header("Content-Disposition: attachment; filename=$filename");
@header("Content-Length: $filesize")
echo file_get_contents($path . $filename);
4

2 回答 2

6

file_get_contents()将整个文件加载到内存中——使用它的日志。

而且,在 PHP 中,脚本可以使用的内存量是有限的(请参阅 参考资料memory_limit ——这可能说明您的下载脚本不适用于大文件。


相反,使用readfile()可能是更好的选择:它将读取文件,并将其内容直接发送到输出缓冲区。

这表示 :

  • 不将整个文件加载到内存中
  • 不必回显您在内存中加载的内容。

只需使用这样的东西就可以了:

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/';
$filename = 'filename.zip';
$filesize = filesize($path . $filename);
@header("Content-type: application/zip");
@header("Content-Disposition: attachment; filename=$filename");
@header("Content-Length: $filesize")
readfile($path . $filename);


(顺便说一句:你真的想用这种方式消除错误,与@操作员一起吗?另一种解决方案可能是不显示它们,而是将它们记录到一个文件中——参见display_errors、、log_errorserror_log

于 2010-04-12T17:37:46.847 回答
1

file_get_contents()将文件内容拉入 PHP VM。用于readfile()流式传输文件而不读取它。

于 2010-04-12T17:37:22.607 回答