laravel 5.5 文件存储必须先正确配置 config/filesystems.php(含 default、disks 和 public 的 url),再确保 .env 中驱动名与凭证完整有效,且每次修改后执行 php artisan config:clear,否则 storage::disk() 调用会静默失败或异常。

直接说结论:Laravel 5.5 的文件存储功能必须先配好 config/filesystems.php,再确保 .env 中的驱动名和凭证正确,否则 Storage::disk() 调用会静默失败或抛出未捕获异常。
配置文件 filesystems.php 必须改哪些地方
这个文件不是“看看就行”,而是实际生效的唯一配置入口。重点改三项:
-
'default'值要和你要用的磁盘名一致(比如设为'public',后续不指定 disk 就默认走它) -
'disks'数组里至少保留'local'和'public';如果要用阿里云 OSS 或 S3,得手动加对应键(如'oss'或's3'),不能只改 env 变量 -
'public'磁盘的'url'必须设成可访问路径,例如env('APP_URL').'/storage',否则Storage::url()返回的链接 404
.env 里驱动和凭证怎么填才有效
Laravel 5.5 默认读取 FILESYSTEM_DRIVER 和 FILESYSTEM_CLOUD 这两个环境变量,但它们只起“开关”作用,不替代磁盘配置本身:
-
FILESYSTEM_DRIVER=public→ 表示默认磁盘是public,但public磁盘是否可用,取决于filesystems.php里有没有定义它 - S3/OSS 类驱动必须显式填密钥:
AWS_KEY、AWS_SECRET、AWS_BUCKET、AWS_REGION缺一不可;阿里云 OSS 则需ALIYUN_OSS_ACCESS_ID、ALIYUN_OSS_ACCESS_KEY、ALIYUN_OSS_BUCKET、ALIYUN_OSS_ENDPOINT - 本地开发时,
FILESYSTEM_DRIVER=local是安全的;但上线后切到public或云存储前,务必确认符号链接已建:php artisan storage:link
为什么 Storage::put() 没报错却没存进目标目录
这是 Laravel 5.5 最常见的静默失败场景,根本原因几乎总是磁盘配置和物理路径不匹配:
-
root路径写错:比如storage_path('app')实际指向./storage/app,但你误写成storage_path('app/public'),会导致文件存到子目录却找不到 - 权限问题:Linux 下 web 用户(如 www-data)对
storage/app没有写权限,put()返回true但实际没写入,日志里也无提示 - 用了
public磁盘但没运行php artisan storage:link,文件确实存进去了,但前端请求/storage/xxx时 nginx/apache 找不到映射路径 - 调用时漏了
disk():比如Storage::put('file.txt', $data)走的是 default 磁盘;若 default 是s3但凭证为空,它不会报错,而是把空内容写进本地 fallback(如果有的话),行为极难排查
上传文件后如何生成可访问 URL
Storage::url() 不是万能的,它只对 visibility 为 'public' 的磁盘有效,且依赖 url 配置项:
- 对
local驱动的public磁盘,Storage::url('image.jpg')返回类似http://your.app/storage/image.jpg,前提是public/storage是指向storage/app/public的符号链接 - 对 S3/OSS 磁盘,
url()直接返回对象存储的外网地址(如https://bucket.oss-cn-hangzhou.aliyuncs.com/image.jpg),不需要符号链接,但必须确保visibility设为'public',否则预签名 URL 会失效 - 不要用
asset('storage/xxx')去拼接 —— 这是旧写法,Laravel 5.5 已弃用;正确方式永远是Storage::disk('public')->url('xxx')
最常被忽略的一点:所有磁盘配置修改后,必须清缓存才能生效 —— php artisan config:clear,否则 .env 或 filesystems.php 的改动不会加载。这点在部署到新服务器时尤其关键,容易卡住一整天。











