Laravel 5.6多文件数组表单验证异常问题求助
Laravel 5.6 多文件上传验证错误提示异常问题解决
我来帮你分析这个问题,这不是Laravel的bug,而是multipart/form-data提交时的特性导致的:当表单使用这个编码类型时,未选择文件的<input type="file">不会被提交到后端,这就导致你的验证规则无法正确匹配到所有预期的字段。
问题根源
- 当你移除
enctype时,表单用默认编码提交,空的file字段会被作为空字符串数组提交,所以Laravel能识别到file.0和file.1这两个字段,验证规则能正常触发。 - 但加上
enctype="multipart/form-data"后,没选文件的输入不会被包含在请求里,$request->input('file')可能是空数组或者只包含已选文件的元素,这就导致你循环生成规则的方式失效,而原来的"file" => "required"只会检查数组是否存在,无法针对每个索引字段给出错误。
解决方案
既然你明确知道表单里有2个文件输入,直接针对每个索引字段定义验证规则即可,不需要依赖请求中的参数:
public function validation(Request $request) { $rules = [ "file.0" => "required|mimes:pdf,docx,odt", "file.1" => "required|mimes:pdf,docx,odt" ]; return Validator::make($request->all(), $rules); }
如果你的文件输入数量是动态的(比如前端可以添加更多),那你需要在前端把预期的文件数量传递到后端,比如隐藏字段:
<form id="form" method="post" action="{{ url("check") }}" enctype="multipart/form-data"> {{ csrf_field() }} <input type="file" name="file[]"> <input type="file" name="file[]"> <!-- 隐藏字段记录文件数量 --> <input type="hidden" name="file_count" value="2"> <input id="submit" type="submit"> </form>
然后在后端根据这个数量生成规则:
public function validation(Request $request) { $fileCount = $request->input('file_count', 0); $rules = []; for ($i = 0; $i < $fileCount; $i++) { $rules["file.{$i}"] = 'required|mimes:pdf,docx,odt'; } return Validator::make($request->all(), $rules); }
为什么之前的方法不行?
你之前尝试循环$request->input('file')来生成规则,但在multipart/form-data下,未选文件的输入不会被提交,所以这个数组的长度可能小于你实际的输入数量,导致部分索引的规则没被定义,自然不会触发对应的错误提示。
这样调整后,就能得到你期望的错误输出了:
{ "name": [ "file.0", "file.1" ], "error": [ "The file.0 must be a file of type: pdf, docx, odt.", "The file.1 must be a file of type: pdf, docx, odt." ] }
内容的提问来源于stack exchange,提问作者Azbrest John
相关产品推荐
相关产品推荐

