简断捷说,事发突然,常年用熟了的ajaxSubmit方法居然这次也坑了我一回。
症状是这样的,一般来说当我表单里有一组input=checkbox的时候,只需要将name设置为一样的,然后提交,后端接收到的是个数组。然而当我表单里面有个用ajax上传文件的input=file控件的时候这个数组失效了,甚至当我把name改成name[]的时候后端也只能接收到最后一个被选中的值。另外form的input=file并不需要在submit的时候提交文件到后端,所以form的enctype就没有设置。
查看了jQuery.Form之后发现源码是这样的逻辑:

var fileInputs = $('input[type=file]:enabled', this).filter(function() { return $(this).val() !== ''; });

一脸懵逼,遍历表单里面启用的input=file,然后当它的值不为空的时候,下面的代码是自动给form加上enctype=multipart/form-data
卧槽,这么不按套路出牌,然后就是所有表单给做成formData,遇到重名的表单就果断自动覆盖了前面的值,于是后端只能取到最末一个的值了。
解决方案:
在file空间的ajax上传任务完成后自动清空file控件的值即可。

$(input[type=file]).val('');