Laravel文件上传存储核心是通过config/filesystems.php统一配置磁盘,public磁盘需设local驱动、root为storage_path('app/public')并运行php artisan storage:link;S3磁盘须在.env和配置中完整填写key、secret、region、bucket等字段,且磁盘名大小写敏感、URL访问需权限与路径匹配。

在 Laravel 中配置文件上传存储,核心是通过 config/filesystems.php 统一管理「磁盘(disk)」,用相同 API 操作不同后端——本地磁盘或云存储(如 S3、OSS)只需改配置,不改业务代码。
public 磁盘:本地公开文件的标准配置
用于头像、文章图片等需直接通过 URL 访问的文件。Laravel 默认已定义 public 磁盘,但必须完成两步才能生效:
- 确认
config/filesystems.php中public磁盘使用local驱动,root指向storage_path('app/public') - 运行
php artisan storage:link,创建public/storage → storage/app/public的符号链接 - 上传后调用
Storage::url($path)生成 URL,例如/storage/avatars/xyz.jpg
S3 磁盘:云存储接入关键项
启用 AWS S3 存储前,需确保配置完整且环境变量就位:
- 在
.env中设置:AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION、AWS_BUCKET -
config/filesystems.php中s3磁盘必须包含driver、key、secret、region、bucket,建议补全url字段用于生成可访问链接 - 若部署在 EC2 并使用 IAM Role,可省略
key和secret,但需确保 PHP SDK 能获取临时凭证
切换存储不等于零改动
换磁盘看似只改一个配置项,实际有几处必须同步处理:
- 业务中调用
$file->store('images', 's3')时,第二个参数必须与config/filesystems.php中disks数组的 key 完全一致(大小写敏感) - 原有
public磁盘下的文件不会自动迁移到 S3,需手动导出+导入,或通过脚本批量重存 - 私有文件(如用户合同)不应走
public磁盘,应另配local或s3私有磁盘,并通过控制器返回响应,避免 URL 直接暴露
验证与排错要点
常见报错往往源于配置未生效或路径不匹配:
- 报
Driver [s3] not supported:检查config/filesystems.php是否以return [ ]正确结尾;确认没有echo或语法错误;运行php artisan config:clear清缓存 - 生成的 URL 404:本地用
public磁盘时,必须已执行storage:link;S3 则检查url配置是否含协议和域名,Bucket 权限是否允许 public-read(如需直链) - 上传失败无提示:在控制器中加
$request->validate(['file' => 'required|mimes:pdf,jpg|max:5120'])显式校验,避免静默跳过


















