Laravel对接S3云存储需四步:安装aws/aws-sdk-php依赖;配置.env中AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION(须用完整命名如oss-cn-hangzhou)、AWS_BUCKET;补充AWS_USE_PATH_STYLE_ENDPOINT=true及带协议的AWS_ENDPOINT;最后用Storage::disk('s3')->put()上传并调用url()前确保setVisibility('public')。

你需要在Laravel项目中快速让文件上传功能对接云存储,而不是继续用本地磁盘扛住所有图片、视频和文档——本地存储迟早会撑爆服务器磁盘,多机部署时文件还不同步,用户上传后刷新页面却看不到新文件。
安装AWS SDK并启用S3驱动
打开终端,进入Laravel项目根目录,执行:
composer require aws/aws-sdk-php
这一步必须做,否则Storage::disk('s3')调用会直接报Class not found。Laravel本身不自带AWS SDK,只提供S3驱动的抽象层,实际HTTP通信全靠这个包。
确认config/filesystems.php中's3'磁盘配置已存在且未被注释——Laravel 9+默认已预置该配置块,但如果你用的是精简版或自定义骨架,可能需要手动补全。
配置云存储凭证与端点参数
编辑.env文件,填入以下四行(缺一不可):
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=my-app-bucket
【AWS_DEFAULT_REGION必须填官方完整命名,不能写cn-hangzhou】——阿里云OSS或腾讯云COS用户注意:若你用的是兼容S3的国产对象存储,这行要改成oss-cn-hangzhou或ap-guangzhou,否则签名失败。
紧接着追加两行关键兼容配置:
AWS_USE_PATH_STYLE_ENDPOINT=true
AWS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
没有AWS_ENDPOINT或协议缺失(比如写成oss-cn-hangzhou.aliyuncs.com),Laravel会尝试拼接bucket名到子域名,而OSS/COS只接受路径式访问(endpoint/bucket/key),请求必然403。
验证S3连接并测试上传
运行命令验证环境变量是否生效:
php artisan tinker → Storage::disk('s3')->getAdapter() → 出现League\Flysystem\AwsS3V3\AwsS3V3Adapter实例即表示驱动加载成功。
在控制器中写一段测试上传逻辑:
$path = Storage::disk('s3')->put('test/', request()->file('upload'));
注意:store()方法会自动生成唯一文件名,put()则需你指定完整路径;前者适合表单直传,后者适合后台生成文件后精确落盘。
上传成功后,用Storage::disk('s3')->url($path)生成可访问链接——但前提是该文件权限为public,否则返回403;private文件必须配合预签名URL使用。


















