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

Laravel 9 + Nova v4 集成AWS S3失败,无法上传及显示图片

Laravel集成AWS S3上传/显示失败排查方案

一、环境变量配置检查

确认.env文件中AWS相关变量无遗漏或错误:

AWS_ACCESS_KEY_ID=你的访问密钥ID
AWS_SECRET_ACCESS_KEY=你的秘密访问密钥
AWS_DEFAULT_REGION=存储桶所在区域(如us-east-1)
AWS_BUCKET=你的存储桶名称
AWS_URL=https://你的存储桶域名.s3.区域.amazonaws.com

注意:AWS_URL不要加末尾斜杠,原生AWS S3无需填写AWS_ENDPOINT。

二、CORS规则修正

当前CORS规则存在请求头和方法限制,修改为:

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://127.0.0.1:8000"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2"
        ],
        "MaxAgeSeconds": 3000
    }
]

要点:

  • AllowedHeaders设为*,避免上传请求头被拦截
  • 补充PUT/POST/DELETE方法,满足上传需求
  • AllowedOrigins去掉末尾斜杠,和请求源保持一致

三、存储桶策略修正

当前策略的Principal配置无效,修改为:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicReadWrite",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::NAME_OF_MY_BUCKET/*"
        }
    ]
}

要点:

  • 使用2012-10-17版本的策略语法,提升兼容性
  • Principal设为*,允许公开读写(若需限制可指定IAM用户ARN)
  • 添加s3:PutObject权限,确保上传权限生效

四、Filesystem配置优化

简化s3磁盘配置,开启错误抛出便于排查:

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'visibility' => 'public',
    'throw' => true, // 开启后上传失败会抛出具体异常
],

注意:原生AWS S3无需配置endpoint和use_path_style_endpoint,仅兼容S3的第三方服务需要。

五、功能验证与Nova配置调整

  1. 先脱离Nova,用基础代码验证S3连接是否正常:
use Illuminate\Support\Facades\Storage;

// 测试上传
$testPath = Storage::disk('s3')->put('test', file_get_contents(public_path('sample.jpg')), 'public');
dd($testPath); // 查看输出路径,同时检查S3存储桶是否存在文件

// 测试访问
$testUrl = Storage::disk('s3')->url($testPath);
dd($testUrl); // 复制URL到浏览器,确认能否打开图片

若这段代码正常运行,说明问题出在Nova配置;若失败,根据抛出的异常信息定位(如权限错误、区域不匹配等)。

  1. Nova字段补充可见性配置:
Image::make('Media', 'image')
    ->disk('s3')
    ->visibility('public')
    ->storeAs(function ($request) {
        return 'uploads/' . uniqid() . '.' . $request->image->getClientOriginalExtension();
    });

六、额外排查点

  • 确认IAM用户拥有s3:PutObject和s3:GetObject权限,存储桶策略和IAM权限需同时满足
  • 本地执行curl https://你的存储桶域名.s3.区域.amazonaws.com,验证网络连通性
  • 检查防火墙、代理是否拦截了本地到S3的请求

内容的提问来源于stack exchange,提问作者Lonare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:01:08