首页 > PHP教程 > php开发知识文章

php按块下载大文件的方法

本文主要介绍了php按块下载大文件的方法,主要使用了这个响应头Content-Transfer-Encoding: chunked,欢迎大家的学习

大文件有200多M,只下载了部分就提示下载完成,不报错。

原因是PHP内存有限制,这就需要我们改为按块下载,就是把大文件切块后逐块下载

chunked编码

分块传输编码(Chunked transfer encoding)是只在HTTP协议1.1版本(HTTP/1.1)中提供的一种数据传送机制。

以往HTTP的应答中数据是整个一起发送的,并在应答头里Content-Length字段标识了数据的长度,以便客户端知道应答消息的结束。

对于动态生成的应答内容来说,内容在未生成完成前总长度是不可知的。因此需要先缓存生成的内容,再计算总长度填充到Content-Length,再发送整个数据内容。而使用分块编码则能得到改观。

分块传输编码允许服务器在最后发送消息头字段。例如在头中添加散列签名。

对于压缩传输传输而言,能一边压缩一边传输。

$file = "aa.txt";
if (file_exists($file)) {
if (FALSE !== ($handler = fopen($file, 'r'))) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: chunked'); //changed to chunked
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
//header('Content-Length: ' . filesize($file)); //不用这种方法
//Send the content in chunks
while (false !== ($chunk = fread($handler, 4096))) {
echo $chunk;
}
}
exit;
}
echo "<h1>系统错误</h1><p>文件不存在!</p>";

fread读取文件

以上就是本文php按块下载大文件的方法的全部内容,希望本文所述对大家PHP程序设计有所帮助。

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。