Laravel 5.6编辑Post时触发getClientOriginalName() on null错误求助
解决Laravel 5.6编辑帖子时
Call to a member function getClientOriginalName() on null错误 嘿,我来帮你排查这个问题!你遇到的Call to a member function getClientOriginalName() on null错误,本质是编辑帖子时没有上传新图片的情况下,代码依然尝试对null的图片文件对象调用方法,结合你的代码,我整理了具体的修复步骤:
1. 修复PostController的核心逻辑问题
(1)修正edit方法的笔误
你的edit方法里写错了模型名,Pots::find($id)应该是Post::find($id),否则会找不到模型实例:
public function edit($id) { $post = Post::find($id); return view('admin.posts.edit', compact('post')); }
(2)重构update方法的图片处理逻辑
当前update方法不管用户是否上传新图片,都直接尝试获取图片文件并调用方法,这就是null错误的根源。我们需要先判断是否有新图片上传,再执行对应的逻辑,同时还要修正代码里的空格错误(比如$request->file('image ')多了空格)和重复更新的问题:
public function update(Request $request, $id) { // 编辑时图片为可选,所以验证规则改为nullable $this->validate($request, [ 'title' => 'required', 'descrption' => 'required', 'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', ]); $post = Post::find($id); $requestData = $request->all(); // 只有当用户上传了新图片时才处理文件 if ($request->hasFile('image')) { $image = $request->file('image'); $fileName = $image->getClientOriginalName(); // 把图片移动到uploads目录 $image->move(base_path() . '/public/uploads/', $fileName); $requestData['image'] = $fileName; } // 只需要一次更新操作即可 $post->update($requestData); // 修正拼写错误:succes → success return redirect()->route('posts.index')->with('success', 'Post was updated'); }
(3)修复store方法的冗余代码
你的store方法里重复调用了Post::create,这会创建两条重复的帖子记录,需要删掉其中一条:
public function store(Request $request) { $this->validate($request, [ 'title' => 'required|string|max:255', 'descrption' => 'required', 'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', ]); $image = $request->file('image'); $fileName = $image->getClientOriginalName(); $request->file('image')->move(base_path() . '/public/uploads/', $fileName); $requestData = $request->all(); $requestData['image'] = $fileName; // 只保留一条创建语句 Post::create($requestData); // 修正拼写错误:succes → success return redirect()->route('posts.index')->with('success', 'Post created successfully'); }
2. 补充说明
- 编辑视图的代码是正常的,它已经显示了原图片,并且支持预览新上传的图片,不需要修改。
- 建议统一字段名拼写:你的代码里用了
descrption,正确拼写是description,如果数据库字段是后者,记得同步修改视图和控制器里的字段名,避免后续出现其他问题。
内容的提问来源于stack exchange,提问作者louisse
相关产品推荐
相关产品推荐

