【问题标题】:Force download of large files on a shared server强制在共享服务器上下载大文件
【发布时间】:2011-11-12 07:29:51
【问题描述】:

我正在尝试在某人的网站上添加一个大型视频文件(约 300MB)的下载链接,但不幸的是他们在共享主机上(我告诉他们,如果有很多人下载,他们将不得不升级) .我不希望人们必须“将目标另存为”,我通常使用此代码来强制下载:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // some day in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename={$file}");
header("Content-Transfer-Encoding: binary");
readfile($file);

这适用于较小的文件,但不适用于较大的文件,即使在打开错误后我也没有收到错误和错误日志。我确定这与共享内存限制(或可能超时)有关,但有谁知道我如何强制在共享服务器上下载大文件,最好没有 javascript,因为我确信我不能将内存限制设置得足够高?

非常感谢,

戴夫

【问题讨论】:

  • 不相关:删除“内容传输编码”。它在 HTTP 中不存在。

标签: php download content-type content-disposition force-download


【解决方案1】:

通常的解决方案是自己做文件输出,让web服务器自己的缓冲区处理事情:

$fh = fopen($file, 'rb') or die("Unable to open $file");
while($data = fread($fh, 10240)) { // 10kbyte chunks.
   echo $data;
}
fclose($fh);

【讨论】:

  • 感谢您的回复,这也适用于小文件,但对于较大的文件也有同样的问题。它似乎加载不超过 3 秒,然后只显示一个空页面?另外,我是否认为这效率要低得多,因为这意味着它必须首先将其全部读入内存,或者我使用的方法也是如此?非常感谢
  • 您一次只能在 PHP 的内存空间中读取 10k。之后的去向取决于您运行的网络服务器。如果这不起作用,请检查服务器的错误日志以了解脚本无法正常工作的原因。
  • 啊,当然,对不起,我疯了 :) 奇怪的是当我检查错误日志时没有提及它,好像它运行良好并且下载页面列在访问权限中也按预期记录,当您访问它时没有任何反应。我不知道为什么它没有出错。
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2015-07-16
相关资源
最近更新 更多