PHP使用ZipArchive创建压缩包如何指定存储路径到company目录
问题诊断
- 生成Zip文件时路径配置错误:调用
ZipArchive::open()方法时仅传入public_path($zip_name),直接将Zip存储路径指向了public根目录,没有拼接你预设的uploads/company/目标路径 - 路径逻辑不统一:代码中已经提前定义了
$destinationPath变量存储目标文件夹路径,但是Zip生成逻辑没有复用该变量,后续调整存储路径时需要修改多处,维护成本高 - 路径判断存在歧义:创建文件夹、判断文件夹是否存在时直接使用相对路径
$destinationPath,不同CLI/WEB执行环境下相对路径解析规则可能不同,容易出现找不到路径的异常
修复后代码
$companyLogoURL = ''; if ($companyLogo) { // 统一定义目标存储路径,用public_path固定解析到public目录下 $destinationPath = 'uploads/company/'; $fullDestinationPath = public_path($destinationPath); // 文件夹不存在则创建 if (!file_exists($fullDestinationPath)) { mkdir($fullDestinationPath, 0777, true); } $imageExt = $companyLogo->getClientOriginalExtension(); $imageName = time().$customer_id.'.'.$imageExt; $imageFormats = ['jpg', 'png', 'gif', 'bmp', 'jpeg', 'PNG', 'JPG', 'JPEG', 'GIF', 'BMP','svg']; // 校验文件大小 $getFileSize = $companyLogo->getSize(); if ($getFileSize <= $this::FILE_SIZE_THREE_MB) { if (in_array($imageExt, $imageFormats)) { $companyLogo->move($fullDestinationPath, $imageName); $companyLogoURL = $imageName; $zip = new ZipArchive(); $zip_name = $imageName . ".zip"; // 拼接路径,直接将Zip生成到uploads/company目录下 $zipFullPath = $fullDestinationPath . $zip_name; if($zip->open($zipFullPath, ZipArchive::CREATE) === TRUE){ $files = File::files($fullDestinationPath); foreach($files as $key => $value){ $samefileNameinZip = basename($value); $zip->addFile($value, $samefileNameinZip); } $zip->close(); } } } }
核心修改说明
- 统一所有路径计算逻辑,新增
$fullDestinationPath变量存储public目录下目标文件夹的绝对路径,避免相对路径解析歧义 - 修改Zip文件生成路径:将原来的
public_path($zip_name)调整为$fullDestinationPath . $zip_name,直接指定Zip生成到uploads/company目录下 - 优化文件遍历逻辑,直接使用
$fullDestinationPath变量获取目标文件夹下的文件,不需要重复调用public_path('uploads/company'),后续调整路径仅需修改$destinationPath一处即可
内容的提问来源于stack exchange,提问作者nung khual
相关产品推荐
相关产品推荐

