Laravel 8上传图片到存储与数据库时触发catch块报错问题求助
Laravel 8 图片上传故障修复方案
问题1:表单缺少文件上传必填属性
上传文件的表单必须声明enctype="multipart/form-data",否则浏览器不会传递文件内容,导致后端无法获取上传的图片。
修改form标签为如下内容:
<form action="{{route('services.store')}}" method="POST" enctype="multipart/form-data">
问题2:控制器逻辑存在缺陷
具体问题点:
- 变量作用域错误:
$image_name仅在$request->hasFile('image')判断块内定义,若判断不通过直接调用会触发未定义变量异常 - 验证规则不完整:image字段仅校验必填,未校验上传内容是否为有效图片
- 冗余操作:
Service::create()本身已完成数据写入,后续调用->save()属于多余操作 - 文件名命名不规范:拼接文件名时重复添加后缀,原文件名已自带后缀,和拼接的
.组合会出现双重后缀问题
修改后的控制器代码:
public function store(Request $request) { $this->validate($request, [ 'name' => ['required', 'max:255'], 'info' => ['required'], 'price' => ['required', 'max:255'], 'image' => ['required', 'image', 'mimes:jpg,jpeg,png,gif', 'max:2048'], // 新增图片校验规则 'category' => ['required', 'exists:categories,id'] // 补充分类校验,避免无效ID写入 ]); $ServiceData = [ 'name' => $request->name, 'info' => $request->info, 'price' => $request->price, ]; //store try { // 初始化变量,避免未定义错误 $image_name = ''; if ($request->hasFile('image')) { $dest_path = 'public/images/services'; $image = $request->file('image'); // 修正文件名命名逻辑 $image_name = time() . '.' . $image->extension(); $image->storeAs($dest_path, $image_name); } // 移除多余的save()调用 Service::create([ 'name' => $request->name, 'info' => $request->info, 'price' => $request->price, 'image' => $image_name, 'category_id' => $request->category, 'user_id' => auth()->id(), ]); // $users = User::all(); //send notification to all customers email..... // Notification::send($users, new servicesNotifications($ServiceData)); } catch (\Exception $e) { // 调试阶段可打开下方注释查看具体错误,上线后关闭 // dd($e->getMessage()); return redirect()->back()->with('status', 'you cannot insert the Service'); } return redirect()->route('services.index')->with('status', 'Service inserted successfully'); }
额外检查项
- 确认项目根目录下
storage和bootstrap/cache目录有读写权限,推荐权限设置为755 - 确认已执行命令
php artisan storage:link创建storage到public的软链,后续才能通过HTTP访问上传的图片 - 确认
services数据表的image字段长度足够存储生成的文件名,且允许非空写入
内容的提问来源于stack exchange,提问作者Osama Mohammed
相关产品推荐
相关产品推荐

