PHP文件下载问题

时间:2010-04-12 17:33:26

标签: php file download file-get-contents

我目前遇到一些用户下载存储在我服务器上的文件的问题。我将代码设置为在用户点击下载按钮后自动下载文件。它适用于所有文件,但是当大小超过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);

2 个答案:

答案 0 :(得分: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,{ {3}}和log_errors

答案 1 :(得分:1)

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