Laravel 7多独立文件上传故障:仅获取首个文件如何解决?
多文件上传仅能获取首个文件的问题排查与解决
问题描述
在表单中设置了三个独立的文件输入框(photo、nid、passport),提交表单时仅能获取第一个输入框的文件,调整输入框顺序后仍仅获取首个字段的值。
表单代码
<form action="{{ route('apply.store') }}" method="POST" enctype="multipart/form-data"> <div class="form-group"> <label for="">Profile</label> <input type="file" name="photo" accept="image/*" required> </div> <div class="form-group"> <label for="">NID</label> <input type="file" name="nid" accept="image/*" required> </div> <div class="form-group"> <label for="">Passport</label> <input type="file" name="passport" accept="image/*" required> </div> </form>
控制器代码
if ($request->hasFile('photo')) { $file = $request->photo ; $destination_path = 'files/uploads/'; $filename = date('Ymdhis'). rand(10,99) . '_' . $file->getClientOriginalName(); $file->move($destination_path, $filename); $apply->photo = $filename; } if ($request->hasFile('nid')) { $file = $request->nid ; $destination_path = 'files/uploads/'; $filename = date('Ymdhis'). rand(10,99) . '_' . $file->getClientOriginalName(); $file->move($destination_path, $filename); $apply->nid = $filename; } if ($request->hasFile('passport')) { $file = $request->passport ; $destination_path = 'files/uploads/'; $filename = date('Ymdhis'). rand(10,99) . '_' . $file->getClientOriginalName(); $file->move($destination_path, $filename); $apply->passport = $filename; }
解决方案
1. 补充Laravel表单必备的CSRF令牌
Laravel的POST表单必须包含CSRF令牌,否则请求会被框架拦截,可能导致数据不全或丢失。修改表单代码,添加@csrf指令:
<form action="{{ route('apply.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="form-group"> <label for="">Profile</label> <input type="file" name="photo" accept="image/*" required> </div> <div class="form-group"> <label for="">NID</label> <input type="file" name="nid" accept="image/*" required> </div> <div class="form-group"> <label for="">Passport</label> <input type="file" name="passport" accept="image/*" required> </div> </form>
2. 检查PHP文件上传配置
如果添加CSRF令牌后问题仍存在,检查PHP配置文件(php.ini)中的以下参数,确保总上传大小足够容纳三个文件:
upload_max_filesize: 单个文件的最大允许大小,建议设置为10M或更大post_max_size: POST请求的总数据大小,必须大于upload_max_filesize,建议设置为20M或更大
修改后重启Web服务器生效。
3. 调试排查接收情况
可以在控制器开头添加调试代码,查看请求实际接收到的文件:
// 打印所有接收到的文件 dd($request->files);
通过输出结果确认哪些文件被正确接收,进一步定位问题。
内容的提问来源于stack exchange,提问作者Jahidul Islam
相关产品推荐
相关产品推荐

