PHP大文件下载的实现思路及方式

背景

随着公司业务的发展,每到月底就需要对公司客户所有签约文档打包下载保存起来,同时由于业务量的增长,打包的文件也就越来越多,下载的压缩包也就越来越大,从一开始的几百M到几个G,这时候传统的打包方式是 将文件压缩包完整的输出给浏览器,这时如果你的文件压缩包高达几个G,那么你的PHP脚本内存就会占用好几个G,如果你的php脚本内存超过你php预设的memory_limit值,那么你就会下载不了,如何解决这个问题呢?那么,这个时候,我们就可以使用“流”的形式,将文件 以二进制流的形式一边输出一边进行下载。

header头的设置

header("Content-Type: application/force-download"); //表示强制下载,服务端将一个完整的文件或者包一并输出浏览器,然后浏览器触发下载(用户看到的下载);缺点是文件或者包有多大脚本就占用多大内存;


header("Content-type: application/octet-stream"); //表示未知的应用程序文件,也是会触发浏览器的下载;配合header("Accept-Ranges: bytes"); //表示告诉浏览器说 服务器返回的文件是以字节的形式


示例代码如下:

$zip_file = '打包下载文件的路径';

$fp       = fopen($zip_file,'r'); //只读方式打开
$filesize = filesize($zip_file);  //文件大小

/***********************header头不要设置错了哦****************************/
header("Content-type: application/octet-stream");  //返回的文件(流形式)
header("Accept-Ranges: bytes");   //按照字节大小返回
header("Accept-Length: $filesize");  //返回文件大小
header("Content-Disposition: attachment; filename=".basename($zip_file)); //这里客户端的弹出对话框,对应的文件名
/*************************************************************************/

/******************************重点要考************************************/
ob_clean(); //清空缓冲区
flush(); //刷新缓冲区,并输出缓冲区的内容给客户端

//设置分流  分流是为了不让整个下载文件占用大量的php脚本内存,如果不分流,你的文件有3G,那么 你的php脚本所设置的内存最大占用值,就要大于3G
$buffer = 1024; //每次从文件中读取的字节数

while(!feof($fp))
{
    $data = fread($fp, $buffer);//从打开的文件中 读取1024个字节数据放入内存中

    echo $data; //将读取到的数据传给浏览器端(客户端)
}

fclose($fp); //关闭打开的文件资源

exit();


原文地址:https://blog.csdn.net/qq_37159249/article/details/124428183  (稍作修改及调整)


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading