Laravel 文件上传处理指南
在 Laravel 中处理文件上传非常简单,框架提供了便捷的方法来处理上传的文件。以下是完整的文件上传处理流程:
1. 基本文件上传
前端表单设置
<form method="POST" action="/upload" enctype="multipart/form-data">
@csrf
<input type="file" name="file">
<button type="submit">上传</button>
</form>
注意:必须设置 enctype="multipart/form-data"
控制器处理
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
public function upload(Request $request)
{
// 验证文件是否存在且有效
$request->validate([
'file' => 'required|file|max:2048', // 最大2MB
]);
// 存储文件
$path = $request->file('file')->store('uploads');
return back()->with('success', '文件上传成功: '.$path);
}
2. 上传文件验证
Laravel 提供了多种文件验证规则:
$request->validate([
'file' => 'required|file|max:5000', // 最大5MB
'image' => 'image|mimes:jpeg,png,jpg,gif|max:2048', // 图片验证
'document' => 'mimes:pdf,doc,docx|max:5120', // 文档验证
]);
3. 文件存储选项
存储到默认磁盘(local)
$path = $request->file('avatar')->store('avatars');
存储到指定磁盘(如public)
$path = $request->file('avatar')->store('avatars', 'public');
指定文件名
$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id, 'public'
);
4. 使用 Storage Facade
use Illuminate\Support\Facades\Storage;
// 存储文件
$path = Storage::putFile('avatars', $request->file('avatar'));
// 获取文件URL(public磁盘)
$url = Storage::url($path);
// 检查文件是否存在
if (Storage::exists($path)) {
// 文件存在
}
// 删除文件
Storage::delete($path);
5. 处理上传的文件信息
$file = $request->file('file');
// 获取文件原始名称
$originalName = $file->getClientOriginalName();
// 获取文件扩展名
$extension = $file->getClientOriginalExtension();
// 获取文件MIME类型
$mimeType = $file->getClientMimeType();
// 获取文件大小(字节)
$size = $file->getSize();
// 获取文件临时路径
$realPath = $file->getRealPath();
6. 图片处理(使用 Intervention Image)
首先安装包:composer require intervention/image
use Intervention\Image\Facades\Image;
$image = $request->file('image');
$filename = time().'.'.$image->getClientOriginalExtension();
// 保存原始图片
$path = $image->storeAs('images', $filename, 'public');
// 创建缩略图
Image::make($image)
->resize(300, 200)
->save(storage_path('app/public/images/thumb_'.$filename));
7. 云存储(如Amazon S3)
配置 .env
文件:
FILESYSTEM_DRIVER=s3
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_DEFAULT_REGION=your-region
AWS_BUCKET=your-bucket
上传代码与本地存储相同:
$path = $request->file('avatar')->store('avatars', 's3');
8. 多文件上传
前端:
<input type="file" name="files[]" multiple>
控制器:
foreach ($request->file('files') as $file) {
$path = $file->store('uploads');
// 保存路径到数据库等操作
}
9. 安全注意事项
- 始终验证上传文件的类型和大小
- 不要信任客户端提供的文件名,应重命名存储
- 考虑将上传目录设置为不可执行
- 对于图片,可以使用 Intervention Image 重新处理以去除潜在恶意代码
通过以上方法,可以在 Laravel 应用中安全高效地处理文件上传功能。