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); }来试试吧!!! 超级简单就可以打包下载了