[英]Forced downloading large file with php
我网站的许多用户报告说下载大文件(80 MB)时出现问题。 我正在使用标头强制下载。 如有必要,我可以提供额外的PHP设置。 我正在使用CakePHP框架,但这段代码都是常规的php。 我正在使用php 5.2 with apache在来自media temple,CentOS Linux的专用虚拟服务器上。 您是否看到以下代码存在任何问题:
set_time_limit(1500);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . basename($file_path) . "\"");
header("Content-Length: ".$content_length);
header("Content-Transfer-Encoding: binary");
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Pragma: public');
header('Expires: 0');
//Change this part
$handle = fopen($file_path, 'rb');
while (!feof($handle))
{
echo fread($handle, 4096);
ob_flush();
flush();
}
fclose($handle);
exit;
基本上,报告的问题是下载开始然后在中间停止。 我认为这是时间限制的问题,所以我添加了set_time_limit代码。 我之前使用的是php readfile函数,但是也没有顺利运行。
PHP启动的http传输的问题是它们很少支持部分请求:
GET /yourfile HTTP/1.1
Range: bytes=31489531-79837582
每当浏览器遇到传输问题时,它都会尝试恢复下载。 你的PHP脚本不适合它(它不是微不足道的,所以没有人这样做)。
所以真的避免这样。 将用户重定向到静态文件并让您的Web服务器处理它。 如果您需要处理授权,请使用检查会话cookie的符号链接或重写文件等技巧,甚至是静态权限文件( ./allowed/178.224.2.55-file-1
)。 可以同样注入任何所需的额外HTTP标头,也可以使用.meta
文件注入。
我没有看到任何麻烦,但是对于S&G来说,尝试将set_time_limit放在while循环中。 这可以确保它们不会达到硬限制(并且只要客户端获取信息)时间限制会延长。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.