laravel云存储需先配置驱动、环境变量及filesystems.php,否则易现filenotfoundexception或静默失败;必须设aws_use_path_style_endpoint=true(尤其minio等兼容服务),正确填写app_url/asset_url、aws密钥走.env,区分store()与put()用法,并确保s3.url配置完整以生成有效url。

直接用 Storage facade 就能上传到云存储,但必须先配好驱动、改好配置、注意文件路径写法——否则 FileNotFoundException 或上传静默失败是常态。
配置 Laravel 5.5 的云存储驱动(如 AWS S3)
Laravel 5.5 默认不启用 S3 驱动,filesystems.php 里只是预留了配置项,得手动填密钥和 region。别漏掉 AWS_USE_PATH_STYLE_ENDPOINT=true(尤其用 MinIO 或某些兼容 S3 的私有服务时),否则会报 AccessDenied。
-
APP_URL和ASSET_URL要设成 CDN 或 S3 bucket 的公开域名,否则生成的 URL 是本地路径 -
STORAGE_DISK环境变量或配置里设为s3,不然Storage::disk('s3')会 fallback 到local - 别把
AWS_SECRET_ACCESS_KEY写死在配置文件里,必须走.env
上传文件时用 store() 还是 put()?
store() 适合表单上传:$request->file('avatar')->store('avatars'),它自动处理临时文件、生成唯一名、返回相对路径;put() 更底层,适合传字符串或 resource,比如 Storage::put('logs/2024.log', $content)。混用会导致路径重复拼接——比如 store('images') 返回 images/xxx.jpg,再拿这个结果去 put('images/'.$path) 就错了。
-
storeAs('photos', 'custom-name.jpg')可控文件名,但要确保目录存在(S3 无需 mkdir,但路径层级仍需逻辑合理) - 上传大文件前记得调
$request->file()->isValid(),否则store()可能抛出未捕获异常 -
store()默认用publicvisibility,S3 上对应的是public-read权限;若需私有访问,得显式传'private'第二个参数
生成可访问的云存储 URL 时的坑
Storage::url('avatars/123.jpg') 在 S3 驱动下返回完整 HTTPS 地址,但前提是 filesystems.php 中 s3 配置的 url 键已正确设置(Laravel 5.5 默认没填)。如果为空,它会拼 APP_URL . '/storage/...' ,显然 404。
- 私有文件不能用
url(),得用temporaryUrl()并传有效期,例如Storage::temporaryUrl('private.pdf', now()->addMinutes(5)) - 如果用了 CloudFront 或自定义域名,要在
filesystems.php的s3.url里写死,不能依赖bucket+region自动推导 -
url()返回的链接不含 query 参数(如签名),所以不要指望它带缓存 busting 或权限参数
最常被跳过的其实是 php artisan storage:link——这命令只对 public 磁盘有效,跟云存储无关,但新手容易误以为它也影响 S3,结果反复检查链接却忘了真正该查的是 .env 里的 AWS_BUCKET 和 IAM 权限是否允许 PutObject。











