如何在Laravel 7中实现图片上传并存储到数据库 食品分类场景示例
前置准备
- 确认
categories数据表中imagename字段为varchar(255)字符串类型,足够存储图片文件名 - 执行命令
php artisan storage:link,将Laravel存储目录映射到公共访问目录,否则前端无法读取上传的图片
控制器store方法修改
将原store方法替换为以下代码,新增请求验证、图片上传处理逻辑:
public function store(Request $request) { // 请求参数验证 $validated = $request->validate([ 'title' => 'required|string|max:255', 'imagename' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', // 限制仅允许2M以内的常见格式图片 ]); $category = new \App\Category(); $category->title = $validated['title']; // 处理上传的图片文件 if ($request->hasFile('imagename')) { $imageFile = $request->file('imagename'); // 生成唯一文件名,避免重名覆盖原有文件 $saveFileName = time() . '_' . uniqid() . '.' . $imageFile->getClientOriginalExtension(); // 存储到storage/app/public/categories目录下 $imageFile->storeAs('public/categories', $saveFileName); // 将生成的文件名写入数据库 $category->imagename = $saveFileName; } $category->featured = $request->has('featured'); $category->active = $request->has('active'); $category->save(); session()->flash('success', "分类'{$category->title}'创建成功"); return redirect()->route('category.index'); }
你现有的表单代码已经正确设置了
enctype="multipart/form-data"属性,无需额外修改。如果不需要强制上传图片,把验证规则中imagename的required去掉,同时给数据表imagename字段设置默认值null即可。
图片前端展示
在列表页、详情页等需要展示分类图片的位置,使用以下代码渲染图片:
<img src="{{ asset('storage/categories/'.$category->imagename) }}" alt="{{ $category->title }}">
可选优化:删除分类时同步删除图片
避免无用图片占用存储空间,可在删除分类的逻辑中加入图片删除代码:
// destroy方法示例 public function destroy(Category $category) { // 先删除本地存储的图片 $imagePath = public_path('storage/categories/'.$category->imagename); if (file_exists($imagePath)) { unlink($imagePath); } $category->delete(); session()->flash('success', '分类删除成功'); return back(); }
内容的提问来源于stack exchange,提问作者Tiffany Alexandra
相关产品推荐
相关产品推荐

