Laravel 10 文件上传需确保表单 enctype、name 一致,用 Storage 门面统一管理存储,public 磁盘配软链接并设 APP_URL,上传用 store/storeAs 指定磁盘,验证必加 mimes 和 isValid。

在 Laravel 10 中配置文件上传与存储,核心是打通「表单接收 → 验证 → 存储 → 访问」整条链路。不改业务代码就能切换本地或云存储,靠的是统一的 Storage 门面和 config/filesystems.php 的磁盘定义。
确保表单和请求能传文件
这是最容易卡住的第一步:
-
form 标签必须带
enctype="multipart/form-data",缺一个字符都会让$request->file()返回 null -
input 的 name 属性(如
name="avatar")要和控制器里$request->file('avatar')的字符串完全一致,大小写、下划线都不能错 - 多文件用数组写法(
name="photos[]"),控制器就用$request->file('photos')获取数组,别写成'photos.0' - 临时加一行
dd($request->allFiles()),确认文件数据是否真的抵达后端——空数组说明问题出在前端或 Nginx/PHP 限制(如client_max_body_size或upload_max_filesize)
配好 public 磁盘并启用 Web 访问
适合头像、文章图片等需直接通过 URL 打开的文件:
- 检查
config/filesystems.php中public磁盘:驱动为'local',root指向storage_path('app/public'),visibility设为'public' - 运行命令创建软链接:
php artisan storage:link—— 这会在public/storage指向storage/app/public - 确保
.env中APP_URL正确(如http://localhost:8000),且public磁盘的url字段拼接为env('APP_URL').'/storage' - 上传后调用
Storage::url('avatars/xyz.jpg')得到类似/storage/avatars/xyz.jpg的路径,浏览器访问该 URL 即可
存文件时选对方法和磁盘
避免路径混乱或 404:
- 用
$file->store('images', 'public'):自动哈希命名,存进storage/app/public/images/,推荐用于防重名场景 - 用
$file->storeAs('avatars', 'user_123.jpg', 'public'):手动指定文件名,适合需保留业务标识或扩展名的情形 - 别用
local磁盘存公开文件——它默认指向storage/app,Web 服务器无法直接读取 - 私有文件(如合同、身份证)不要走
public磁盘,应另配独立磁盘(如private_local或private_s3),并通过控制器返回响应,不暴露直链
加验证规则防上传漏洞
安全不能只靠前端:
- 验证必须显式写,比如:
'avatar' => 'required|file|mimes:jpeg,png,gif|max:2048' - 多文件上传时,规则要用通配符:
'photos.*' => 'required|file|mimes:jpg,png|max:1024',只写'photos' => 'array'不校验内容 -
mimes比extensions更安全,它读文件头而非后缀,防伪装(如把 .php 改成 .jpg) - 上传前加
$file->isValid()判断,避免处理损坏或超限文件


















