Laravel 文件上传需四步:前端设 enctype="multipart/form-data";后端用 $request->file() 获取并 validate() 校验类型与大小;通过 Storage::store() 保存至指定磁盘;最后用 Storage::url() 生成访问链接或存路径到数据库。

在 Laravel 中实现文件上传功能,核心是利用框架内置的请求验证、文件存储和路径管理能力,整个流程简洁且安全。关键在于正确处理表单提交、验证文件类型与大小、保存到指定磁盘(如本地或云存储),并可选地生成访问 URL。
1. 前端表单需设置 enctype="multipart/form-data"
普通 POST 表单无法上传文件,必须显式声明编码类型:
<form action="{{ route('upload.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="avatar" accept="image/*">
<button type="submit">上传头像</button>
</form>
注意:name 属性值(如 avatar)将作为后端获取文件的键名;可加 accept 限制前端选择范围,但不能替代后端验证。
2. 后端接收并验证文件
在控制器方法中使用 $request->file() 获取上传实例,并用 validate() 强制校验:
- 检查是否为有效上传:
'avatar' => 'required|file' - 限制类型:
'avatar' => 'mimes:jpeg,jpg,png,gif|max:2048'(单位 KB) - 防止空文件或错误上传:
$request->hasFile('avatar') && $request->file('avatar')->isValid()
示例验证规则:
request()->validate([
'avatar' => 'required|file|mimes:jpeg,jpg,png,gif|max:2048',
]);
3. 保存文件到指定位置
Laravel 使用 Storage 门面统一管理文件存储。默认配置下,文件保存在 storage/app/ 目录:
- 保存并获取路径:
$path = $request->file('avatar')->store('avatars');→ 返回类似avatars/xxx.jpg - 自定义文件名:
$request->file('avatar')->storeAs('avatars', 'user_123.jpg'); - 保存到 public 磁盘(便于直接访问):
->store('avatars', 'public'),再运行php artisan storage:link创建软链接
若使用云存储(如 OSS、S3),只需在 config/filesystems.php 配置对应 disk,并在 store() 中指定磁盘名即可。
4. 返回或记录文件信息
上传成功后,通常需要保存路径到数据库或返回给前端:
- 生成可访问 URL:
Storage::url($path)(仅对public磁盘有效) - 获取绝对路径(本地调试):
Storage::path($path) - 存入模型:
User::find(1)->update(['avatar_path' => $path]);
注意:不要直接存储原始 $_FILES 数据,Laravel 的 UploadedFile 对象已封装好安全操作。


















