Laravel更新已存图片时Call to a member function store() on string报错如何解决
错误原因
你碰到的Call to a member function store() on string报错,核心原因是更新操作中没有判断用户是否上传了新图片:当用户提交编辑表单但没选新的图片文件时,$request->photo_patch拿到的是旧的路径字符串,不是UploadedFile对象,自然没法调用store()方法。
修复方案
1. 修改控制器update方法
你需要先判断请求中是否存在新上传的图片文件,存在才执行存储逻辑,同时可以删除旧图片避免占用存储空间,代码修改如下:
public function update(Request $request) { $data = Club::find($request->id); $data->name = $request->name; $data->description = $request->description; $data->address = $request->address; $data->city_id = $request->city_id; // 判断是否有新上传的图片 if ($request->hasFile('photo_patch') && $request->file('photo_patch')->isValid()) { // 先删除旧的图片文件 $oldPath = public_path('storage/' . $data->photo_patch); if (file_exists($oldPath)) { unlink($oldPath); } // 存储新图片,更新路径 $data->photo_patch = $request->photo_patch->store('images','public'); } $data->save(); return redirect('clubs'); }
2. 修复编辑表单的细节问题
你当前的编辑表单有几处小错误,建议同步修改避免其他异常:
- textarea标签不支持
value属性,需要把默认值写在标签中间:<textarea rows="2" style="width:100%;height:60px;" name="description" class="form-control">{{$data->description}}</textarea> - 城市选择下拉框需要默认选中俱乐部原来的所属城市,修改option部分代码:
<option value="{{$city->id}}" {{ $data->city_id == $city->id ? 'selected' : '' }}>{{ $city->name }}</option> - 你已经在表单里写了city_id的下拉选择框,上方重复的
hidden类型city_id输入框可以删掉,避免提交参数冲突。
内容的提问来源于stack exchange,提问作者MichalGrab
相关产品推荐
相关产品推荐

