Laravel 7实现多张图片打包为zip文件下载的方法咨询
Laravel多图片打包ZIP下载实现方案
前置准备
- 确认PHP已开启
ZipArchive扩展(PHP自带,大部分环境默认开启,可通过phpinfo验证) - 确认存储图片的目录权限正常,临时文件目录可写入
控制器代码修改
首先在你的InboxController顶部引入依赖类:
use ZipArchive; use Illuminate\Support\Facades\Storage;
然后修改你的dowloads方法如下:
public function dowloads($id) { // 查询数据,找不到直接返回404 $clientfiles = Inbox::findOrFail($id); // 把JSON格式的文件名转成数组 $fileNames = json_decode($clientfiles->file, true); if (!$fileNames || !is_array($fileNames)) { abort(404, '当前记录没有可下载的文件'); } // 图片本地存储路径,不要用HTTP地址,要用服务器本地绝对路径 $filePath = public_path('uploads/images/'); // 临时ZIP文件存储路径,放在storage的temp目录下,提前确保该目录存在 $zipPath = storage_path('app/temp/inbox_files_'.$id.'.zip'); // 初始化ZipArchive $zip = new ZipArchive; if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) { foreach ($fileNames as $fileName) { $singleFilePath = $filePath . $fileName; // 只添加存在的文件 if (file_exists($singleFilePath)) { $zip->addFile($singleFilePath, $fileName); } } $zip->close(); } else { abort(500, 'ZIP文件创建失败,请检查目录权限'); } // 返回下载响应,下载完成后自动删除临时ZIP文件 return response()->download($zipPath, 'inbox_files_'.$id.'.zip')->deleteFileAfterSend(true); }
注意事项
- 你当前代码里的方法名
dowloads存在拼写错误(少了个n,正确为downloads),请确保和路由里绑定的方法名保持一致,避免路由报错 - 如果你的图片存储在
storage/app目录而非public目录,请将public_path替换为storage_path('app/你的图片目录') - 若测试时提示ZIP创建失败,请先手动创建
storage/app/temp目录,并设置该目录权限为755 - 你的现有路由、视图代码无需修改,可直接正常使用
内容的提问来源于stack exchange,提问作者zubair malik
相关产品推荐
相关产品推荐

