Laravel 9生成Zip备份后仅文件名存入AWS S3问题求助
问题分析与解决方案
你的问题出在S3上传的代码行:
Storage::disk('s3')->put('public/backup', $fileName);
这里第二个参数传入的是文件名字符串,Laravel会把这个字符串直接作为文件内容上传到S3,所以你看到的只有文件名文本,而非实际的Zip压缩包。
修正后的代码
你需要传入Zip文件的内容,或者使用Laravel提供的文件上传方法,以下是几种可行的写法:
方法1:读取文件内容上传
$zip = new ZipArchive; $azienda = User::value('azienda'); $fileName = time() . $azienda . ".zip"; $zipPath = public_path($fileName); if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) { $files = File::files(public_path('/images/images')); foreach ($files as $value) { $relativeNameInZipFile = basename($value); $zip->addFile($value, $relativeNameInZipFile); } $zip->close(); }; // 修正上传逻辑:读取文件内容,同时指定完整的S3目标路径(包含文件名) Storage::disk('s3')->put("public/backup/{$fileName}", file_get_contents($zipPath)); // 可选:上传完成后删除本地生成的Zip文件,节省空间 File::delete($zipPath);
方法2:使用Laravel的putFileAs方法(推荐)
putFileAs是Laravel专门用于上传文件的方法,会自动处理文件内容,更符合框架的最佳实践:
$zip = new ZipArchive; $azienda = User::value('azienda'); $fileName = time() . $azienda . ".zip"; $zipPath = public_path($fileName); if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) { $files = File::files(public_path('/images/images')); foreach ($files as $value) { $relativeNameInZipFile = basename($value); $zip->addFile($value, $relativeNameInZipFile); } $zip->close(); }; // 使用putFileAs上传,第一个参数是S3目录,第二个是本地文件路径,第三个是目标文件名 Storage::disk('s3')->putFileAs('public/backup', $zipPath, $fileName); // 可选:删除本地Zip文件 File::delete($zipPath);
额外注意事项
- 确保
public_path('/images/images')目录存在且有可读权限,否则Zip文件会为空 - 生成Zip后可以先检查
$zipPath对应的文件是否存在且大小正常,排除Zip创建失败的可能 - 确认S3的
public/backup目录有写入权限,避免上传失败
内容的提问来源于stack exchange,提问作者Moreno
相关产品推荐
相关产品推荐

