php按块下载大文件的方法
2018-02-16 10:17:12
•
阅读
打赏
本文主要介绍了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>";
以上就是本文php按块下载大文件的方法的全部内容,希望本文所述对大家PHP程序设计有所帮助。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型