【问题标题】:PHP File Downloading QuestionsPHP 文件下载问题
【发布时间】:2011-02-07 02:50:07
【问题描述】:

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

【问题讨论】:

  • 我不是 PHP 专家,但是您是否尝试过增加脚本内存限制。

标签: php file download file-get-contents


【解决方案1】:

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

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


相反,使用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_errorslog_errorserror_log)

【讨论】:

  • 帕斯卡,感谢您的帮助和重要信息。看起来我的脚本限制足够大并且 readfile 函数工作正常。我删除了 @ 运算符以重新打开错误。虽然,我在下载较大的文件时仍然遇到问题。还有什么想法吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2017-11-02
    相关资源
    最近更新 更多