【问题标题】:PHP force download of remote file without reading into memoryPHP强制下载远程文件而不读入内存
【发布时间】:2012-02-11 04:29:48
【问题描述】:

是否可以在 PHP 中强制下载远程文件而不将其读入内存?我知道 fpassthru()、readfile()、file_get_contents() 都是先将文件读入内存,然后再输出到浏览器中。

这是我的代码:

if($url = getRemoteFileURL($file_id))
{
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename="abc.zip"');
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  header('Pragma: no-cache');

  readfile($url);  // is there a better function ?
}

我不想做 header("Location: ") 因为那会暴露 URL

【问题讨论】:

  • 您可以使用远程文件的分块获取,并分发碎片。但这需要您的脚本发出多个 http 请求,而且效率很低。

标签: php http-headers buffer remote-access readfile


【解决方案1】:

如果您对下载的文件执行 header("Location: ...");,则该 URL 实际上并没有透露太多,如果有的话。

无论如何,readfile 可能是您的最佳选择。我会假设,假设它直接写入输出,PHP 通过读取文件的一部分,然后输出它,然后读取下一部分,等等,总体上使用很少的内存。

【讨论】:

  • 该 URL 会显示给任何精明到可以打开 Inspector 的人,有时这是不可接受的。此外,如果这样做,您将无法控制文件名。
  • 是的,亚历克是对的。在 Chrome 中,您只需转到当前的下载页面,即可看到 URL。此外,只要正在下载文件,readfile 就会使脚本运行。 IMO 效率不高。例如,如果我下载一个 1GB 的文件 30 分钟,脚本将运行 30 分钟(不知道某些服务器是否会因为脚本运行那么长时间而超时)
  • 默认的最大 PHP 脚本执行时间是 30 秒...所以是的,这不适用于默认值。
  • 我在同一条船上我发现了这个,我认为这是一个解决方案kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote
猜你喜欢
  • 2010-12-03
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2013-07-02
  • 1970-01-01
  • 2012-12-18
  • 2013-06-26
相关资源
最近更新 更多