【问题标题】:Upload multiple files using ajax and spring mvc使用ajax和spring mvc上传多个文件
【发布时间】:2015-11-03 22:16:27
【问题描述】:

我正在尝试使用 FormData 和 spring 上传多个文件。

HTML:

<input type="file" name="img" multiple id="upload-files">

JS代码:

var ajaxData = new FormData();
var files = $('#upload-files').prop('files');
for(var i=0;i<files.length;i++){
    ajaxData.append('file['+i+']', files[i]);
}
ajaxData.append("file", files);
$http.post('../rest/upload', ajaxData, {
    headers: {'Content-Type': undefined },
    transformRequest: angular.identity
});

弹簧控制器代码:

@RequestMapping(value = "/upload", produces="application/json", method = RequestMethod.POST)
@ResponseBody
public String upload(
        @RequestParam ArrayList<MultipartFile> files
){
    System.out.println(files.size());
    return null;
}

但是,在提交包含多个文件的请求时,文件数显示为 0。在使用数组表示法 MultipartFile[] files 而不是 ArrayList 时,它会给出 400,错误请求。

如何让 spring 控制器处理多个文件?我无法找到其他 SO 问题的解决方案。

【问题讨论】:

  • 您是否尝试将 List 重新定位到一个对象并在 spring-servlet.xml 上配置了 CommonsMultipartResolver 和 InternalResourceViewResolver?
  • 您是否在表单提交按钮中正确添加了 encType?例如
    输入类型为

标签: java jquery ajax spring spring-mvc


【解决方案1】:

默认情况下,DataBinder 尝试使用约定将请求参数绑定到目标对象 - 请求中的参数名称(在您的情况下为 FormData)和控制器操作中的参数名称必须匹配。

在您的情况下,您应该将 file[i] 重命名为 files[i]

for(var i=0; i < files.length; i++){
    ajaxData.append('files[' + i + ']', files[i]);
}

将动作的参数从ArrayList&lt;MultipartFile&gt; files重命名为ArrayList&lt;MultipartFile&gt; file


另外,删除这行ajaxData.append("file", files);(就在for循环之后),因为它设置了一个同名的参数,可能会出现某种故障。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2018-10-23
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2013-12-23
    相关资源
    最近更新 更多