Laravel 5.5更新Logo报错:Call to a member function getClientOriginalExtension() on string
解决「Call to a member function getClientOriginalExtension() on string」错误
这个错误的核心原因很清晰:你在更新逻辑里用$request['logo'] === null判断是否有新logo上传,但实际上当用户没选择新文件时,表单可能提交了旧logo的路径字符串(比如表单里有隐藏字段保存当前logo),这时候$request->logo是字符串而非文件对象,自然没法调用getClientOriginalExtension()方法。
修复步骤:
- 调整验证规则:给
logo加上file验证,确保只有上传文件时才会进入文件处理逻辑 - 替换判断条件:用
$request->hasFile('logo')准确判断是否有新文件上传,而非检查是否为null - 优化代码健壮性:用
findOrFail替代find,增加旧文件清理(可选)
修改后的控制器代码如下:
public function update(Request $request, $id) { request()->validate([ 'title' => 'required', 'url' => 'required', 'logo' => 'nullable|file', // 新增file验证,确保上传的是有效文件 ]); // 用findOrFail替代find,找不到对应电台时直接返回404,避免空对象操作 $station = Internetradiostations::findOrFail($id); // 先获取title和url的输入值 $input = $request->only(['title', 'url']); // 仅当用户上传了新logo时,才执行文件处理逻辑 if ($request->hasFile('logo')) { // 可选:删除服务器上的旧logo文件,避免冗余文件堆积 if ($station->logo) { $oldLogoPath = public_path('logos/' . $station->logo); if (file_exists($oldLogoPath)) { unlink($oldLogoPath); } } // 处理新logo上传 $input['logo'] = time().'.'.$request->logo->getClientOriginalExtension(); $request->logo->move(public_path('logos'), $input['logo']); } // 更新电台信息 $station->update($input); return redirect()->route('internetradiostationseditor.index') ->with('success','Internet radio station ge-updated'); }
额外说明:
$request->hasFile('logo')是Laravel判断文件上传的标准方法,它会检查请求中是否包含有效的上传文件,完全不受旧路径字符串的干扰- 旧文件删除逻辑可以根据需求选择保留或删除,若不需要直接移除对应代码块即可
findOrFail比find更严谨,能避免因ID错误导致的空指针问题
内容的提问来源于stack exchange,提问作者Teun
相关产品推荐
相关产品推荐

