Laravel更新带图片数据时报Call to a member function getClientOriginalName()错误
问题解决方案
核心报错原因
你触发Call to a member function getClientOriginalName()错误的根本原因是文件操作的执行顺序完全错误:你在判断用户是否上传图片的hasFile方法之前,就直接调用了$request->file('images')->getClientOriginalName(),当用户未上传新封面时,$request->file('images')返回null,对空值调用成员方法就会触发该错误,你添加的var_dump写在错误的位置,完全起不到调试作用反而会加剧问题。
存在的其他逻辑错误
除了核心报错之外,你的代码还有多处逻辑错误,会导致功能无法达到预期:
- 查询旧封面路径的代码错误,拿到的是查询构造器对象而非真实的图片路径
- HTML表单未添加Laravel PUT请求的伪方法指令,请求路由匹配会失败
- 字段更新逻辑错误,上传新图时会覆盖掉其余字段的更新数据,仅更新封面字段
- 变量比较逻辑错误,用单引号包裹变量导致变成字符串比较,finished、reading字段取值永远错误
- 旧封面删除路径不匹配,无法正确删除废弃的旧封面文件
- 未上传图片时的中断逻辑错误,直接终止请求无法执行保留旧图的逻辑
修复后的代码
1. 视图代码修改
在表单的csrf_field()下面添加PUT伪方法指令:
{{ csrf_field() }} @method('PUT') <!-- 其余表单内容保持不变 -->
2. 控制器代码修改
use Illuminate\Support\Facades\File; use Carbon\Carbon; public function updateBook(Request $request, $id){ // 先查询图书原数据 $book = DB::table('books')->where('id', $id)->first(); if (!$book) { return redirect('home')->with('status', '图书不存在'); } $oldImage = $book->images; $path = public_path('/Uploads'); $filename = $oldImage; // 默认保留旧图 // 仅当用户上传了新图时处理文件 if($request->hasFile('images')){ $file = $request->file('images'); $filename = time().$file->getClientOriginalName(); $file->move($path, $filename); // 删除旧图 if ($oldImage && File::exists($path.'/'.$oldImage)) { File::delete($path.'/'.$oldImage); } } // 组装所有要更新的字段 $pageCount = $request->input('pageCount'); $readPage = $request->input('ReadPage'); $data = [ 'name'=> $request->input('bookName'), 'year'=> $request->input('tahunT'), 'author'=> $request->input('author'), 'summary'=> $request->input('Summary'), 'publisher'=> $request->input('publishers'), 'pageCount' => $pageCount, 'readPage'=> $readPage, 'finished' => $pageCount == $readPage ? true : false, 'reading' => $readPage > 0 ? true : false, 'images' => $filename, 'updatedAt'=> Carbon::now() ]; // 执行更新 DB::table('books')->where('id', $id)->update($data); return redirect('home')->with('status', '图书信息更新成功'); }
内容的提问来源于stack exchange,提问作者Shabrina Nurdiani S
相关产品推荐
相关产品推荐

