thinkphp5中自带了ZipArchive,我们可以直接调用打包文件;
第一步: 因为是批量打包文件,所以我们需要传入数据id,我是在页面中使用js方法拼接的id字符串,所以在后台我需要explode将字符串转换为数组才可以,如果你们的方法与我的不一样,可省掉这一部分;
第二步: 循环id,查找要打包的文件路径,并且将所有的文件路径保存在同一个数组中(代码中的$files[]);
第三步: 参数解释:
$filename: 设置压缩文件的名称以及位置,这样我们下载的时候才能下载成功;
array_pop($files): 因为我拼接的ids格式为: 1,2,3, 后面多了一个, 所以我在转换为数组后需要将最后一个,去掉,这里是我根据情况使用的,如果你们没有这种情况,这部分则不需要,如果最后一个的空数组不去掉的话,在打包的时候会报错
public function download_files(){
$param = $this->request->param();
$ids = explode(',', $param['ids']);
//要打包的文件
foreach ($ids as $k => $v){
$files[] = Db::name('qrcode')->where('id',$v)->value('qrcode');
}
$zip = new \ZipArchive;
//压缩文件名
$filename = 'uploads/qrcode/qrcode.zip';
//新建zip压缩包
$zip->open($filename,\ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE);
//循环压缩文件
array_pop($files);
foreach($files as $key => $value){
$zip->addFile($value,basename($value));
}
//打包zip
$zip->close();
header("Cache-Control:public");
header("Content-Description: File Transfer");
header("Content-disposition: attachment; filename=".basename($filename));//文件名
header("Content-Type:application/zip"); //格式为zip
header("Content-Transfer-Encoding:binary"); //这是二进制文件
header("Content-Length:".filesize($filename)); //文件大小
@readfile($filename);
}
来试试吧!!! 超级简单就可以打包下载了