BadMethodCallException错误:UploadedFile无save方法,Laravel文件存库求助
问题分析
你遇到的BadMethodCallException是因为错误调用了Illuminate\Http\UploadedFile类的save()方法——这个类负责处理上传文件,本身没有ORM的save()方法,只有Eloquent模型才具备该方法。
你的代码存在几个核心问题:
- 变量重复赋值:一开始用
$data存储文件名数组,后来又将$data赋值为new Country(),直接覆盖了之前的文件名数据 - 错误操作上传文件对象:
$file = $request->file;获取的是上传文件实例,你试图给它赋值documentname并调用save(),完全不符合Laravel的逻辑 - 模型使用混淆:注释掉
new File()却用了Country模型,若要存储文件信息,应该用对应的文件模型(比如File),而非Country(除非业务逻辑确实要求把文件数据存在Country表,但变量名会造成混淆)
修复后的代码示例
假设你有一个File模型(对应数据库files表,包含uploadername、groupname、description、documentname字段),修复后的代码如下:
public function store(Request $request) { $this->validate($request, [ 'documentname' => 'required', 'documentname.*' => 'mimes:doc,pdf,docx,zip,png,jpeg,jpg' // 修正拼写错误:jpge → jpeg ]); $filenames = []; if($request->hasfile('documentname')) { foreach($request->file('documentname') as $file) { $name = time() . '.' . $file->extension(); // 用Laravel推荐的storage_path()获取存储路径 $file->move(storage_path('app/public'), $name); $filenames[] = $name; } } // 使用正确的文件模型 $fileRecord = new File(); $fileRecord->documentname = json_encode($filenames); $fileRecord->uploadername = $request->uploadername; $fileRecord->groupname = $request->groupname; $fileRecord->description = $request->description; // 调用Eloquent模型的save()方法 $fileRecord->save(); return back()->with('message', '文件上传成功'); }
额外说明
- 修正了验证规则里的
jpge拼写错误为jpeg,避免不必要的验证失败 - 用
storage_path('app/public')替代base_path() . '/storage/app/public',符合Laravel路径规范 - 重命名变量为
$filenames存储文件名数组,避免和模型变量混淆 - 若业务确实需要用
Country模型存储文件信息,将new File()改为new Country()即可,但建议调整变量名(比如$countryRecord)提升代码可读性
内容的提问来源于stack exchange,提问作者boros dominator
相关产品推荐
相关产品推荐

