You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:31:10