Laravel表单上传文件存储时报Call to a member function store() on null错误
错误产生原因
- 上传文件参数名调用错误:前端多文件上传字段命名为
files[],Laravel 框架解析多文件字段时,调用$request->file()获取文件不需要携带后缀[],使用$request->file('files[]')会返回null,调用store()方法自然触发报错。 - 多文件处理逻辑错误:
$request->file('files')返回的是上传文件对象的数组,数组无法直接调用store()方法,需要遍历逐个处理文件存储。 - 模型批量赋值配置错误:
$fillable中配置的字段为files[],但实际数据表对应的字段名为files,批量赋值时无法正常匹配字段。
解决方案
- 修正模型配置
首先修改Transfer模型的$fillable参数,同时新增$casts配置将files字段转换为数组类型,方便自动处理JSON序列化/反序列化:
// Transfer模型代码 protected $fillable = [ 'recipient_mail', 'sender_mail', 'title', 'message', 'files' ]; protected $casts = [ 'files' => 'array' ];
- 修正控制器文件处理逻辑
遍历所有上传文件逐个存储,将存储路径集合存入数据库:
public function transferSubmit(TransferRequest $request){ $filePaths = []; // 遍历处理每个上传文件 foreach ($request->file('files') as $file) { $filePaths[] = $file->store('public/files'); } $transfer = Transfer::create([ 'sender_mail' => $request->input('sender_mail'), 'recipient_mail' => $request->input('recipient_mail'), 'title' => $request->input('title'), 'message' => $request->input('message'), 'files' => $filePaths, ]); return redirect(route('home'))->with('message', 'File inviato con successo'); }
注:如果数据表files字段为字符串类型,未使用JSON格式,可将files赋值行替换为'files' => json_encode($filePaths)即可正常存储。
内容的提问来源于stack exchange,提问作者gianmarco varrone
相关产品推荐
相关产品推荐

