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

Laravel 9上传文件至AWS S3 Bucket失败求助排查

问题排查与解决方案

首先,你的报错信息不完整,Error executing "PutObject"后续应该包含具体错误原因(如签名不匹配、端点不可达、权限拒绝等),建议查看Laravel的storage/logs/laravel.log获取完整堆栈信息,这是定位问题的核心依据。

以下是针对当前场景的具体排查与修复步骤:

1. 修正S3端点配置

你的.env中AWS_ENDPOINT和AWS_URL存在配置错误:

  • us-east-2区域的标准S3端点为s3.us-east-2.amazonaws.com,而非silkweb-s3.us-east-2.amazonaws.com
  • AWS_URL应直接使用存储桶的标准访问地址:https://silkweb.s3.us-east-2.amazonaws.com
  • 若未使用S3兼容存储或自定义端点,可直接移除AWS_ENDPOINT配置

修正后的AWS配置示例:

AWS_ACCESS_KEY_ID=AKI***************DAY
AWS_SECRET_ACCESS_KEY=jotz*************************ru
AWS_DEFAULT_REGION=us-east-2
AWS_BUCKET=silkweb
AWS_URL=https://silkweb.s3.us-east-2.amazonaws.com
AWS_USE_PATH_STYLE_ENDPOINT=false

2. 修正文件路径的前置斜杠

S3对象键不允许以斜杠开头,你的上传代码中路径写法有误:

// 错误写法:路径开头带斜杠
$filepath = "/user/profile/".$user_id;  
// 正确写法:移除开头斜杠
$filepath = "user/profile/".$user_id;  
$upload_path =  Storage::disk('s3')->put($filepath, $request->file('file'));

3. 确认存储桶权限配置

即使IAM用户拥有全权限,存储桶的桶策略或公共访问设置可能被意外修改:

  • 登录AWS控制台,进入silkweb存储桶的权限页面
  • 检查「阻止公共访问」设置,确保未启用阻止写入的规则
  • 检查自定义桶策略,确认允许IAM用户执行s3:PutObject操作

4. 彻底清除配置缓存

执行以下命令确保配置完全生效:

php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear

若服务器启用了OPcache,需重启PHP服务或清除OPcache缓存。

5. 验证IAM用户权限

使用AWS CLI测试新创建的IAM用户是否能正常上传:

# 配置凭证
aws configure set aws_access_key_id AKI***************DAY
aws configure set aws_secret_access_key jotz*************************ru
aws configure set default.region us-east-2
# 上传测试文件
aws s3 cp test.png s3://silkweb/user/profile/test.png

若CLI上传失败,说明问题出在AWS端权限或配置;若CLI成功,再回到Laravel排查代码或配置遗漏。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:55:16