PHP通过流下载并打包成zip
针对多个大文件的打包成zip下载需求,比较流行的方案有前端打包和后端打包两种,前端打包主要基于StreamSaver.js,后端打包则需要后端向前端提供已打包好的流。
考虑到在打包超过4GB的文件时zip协议需要支持zip64,archive是一个可用的开源库,在使用了其Zip.php作为模块后,引用类的方法
$zip = new ZipSTORE, TRUE, Zip::STDOUT;
//遍历数据
foreach ($fileList as $file) {
//添加文件
//这里需要注意一下,如果文件名或者注释中涉及中文,那么要注意字符串保存使用的编码不是GBK时要改为GBK
$zip->addFile($file['path'], iconv("utf-8", "gbk", $file['name']));
//对于output_buffering为On的场景,需要手动调用ob_flush()防止输出数据堆积在PHP输出缓存中
ob_flush();
//每次调用完压缩算法把输出缓存挤出去
flush();
}
//输出文件尾部
$zip->finalizeArchive();