背景
随着公司业务的发展,每到月底就需要对公司客户所有签约文档打包下载保存起来,同时由于业务量的增长,打包的文件也就越来越多,下载的压缩包也就越来越大,从一开始的几百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 (稍作修改及调整)
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论