Laravel更新表单未重传图片导致数据库图片字段为空如何解决
核心原因
type="file" 类型的输入框无法通过value属性预设值是浏览器的安全限制,目的是避免站点恶意窃取用户本地文件,因此你无法通过file输入框提交原有图片值,按以下步骤调整即可:
第一步:修改表单代码
新增隐藏域传递原有图片地址,同时可删除file输入框无效的value属性:
<form action="/admin/settings/why-us/update/{{$data->id}}" enctype="multipart/form-data" method="POST"> @csrf <input type="text" class="form-control" name="title" value="{{$data->title}}"> <!-- 新增隐藏域存储原有图片地址 --> <input type="hidden" name="old_image" value="{{$data->image}}"> <input type="file" class="form-control" name="image"> <button type="submit" class="btn btn-success py-2 px-4 text-white">Update changes</button> </form>
第二步:修改控制器逻辑
默认使用旧图片地址,仅当用户上传新图片时才更新图片字段:
public function updateWhyusPageSetting(Request $request,$id) { $title = $request->input('title'); // 先取旧图片地址作为默认值 $image_upload = $request->input('old_image'); if($request->hasFile('image')) { $image = $request->file('image'); $filename = $image->getClientOriginalName(); $image->move(public_path('/frontend/images/'), $filename); // 上传了新图片就替换为新文件名 $image_upload = $filename; // 可选:如果需要清理旧图片,可加下面的代码 // $old_image_path = public_path('/frontend/images/').$request->input('old_image'); // if(file_exists($old_image_path)) { // unlink($old_image_path); // } } DB::table('features') ->where('id', $id) ->update([ 'title' => $title, 'image' => $image_upload ]); \Session::flash('flash_message', __('Why us data updated')); \Session::flash('flash_type', 'success'); return redirect()->back(); }
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

