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
相关产品推荐
相关产品推荐

