Spring MVC多文件上传具有HTML5多文件格式功能

azp*_*lic 13 java html5 spring file-upload

我正在尝试使用带有@Controller和@RequestMapping的spring 3.1.2上传多个文件.

这是我做的和我的配置.

Html5表格:

<form action="addFileSystemImage.foo" method="post" enctype="multipart/form-data">

    <input class='fileInput' type="file" name="files[]" multiple="multiple" />

    <input type="text" value="13asdf12eadsf" name="locId"/>

    <input type="submit" />

</form>
Run Code Online (Sandbox Code Playgroud)

控制器方法:

@RequestMapping(value="/publisher/addFileSystemImage.foo", method=RequestMethod.POST)
public @ResponseBody List<UploadedFile> addFileSystemImage(@RequestParam("files[]") ArrayList<MultipartFile> files, String locId, HttpServletRequest request) {

 //do lotsa voodoo rocket science here to process the files  

}
Run Code Online (Sandbox Code Playgroud)

我的conf:

 <mvc:annotation-driven />
 <context:component-scan base-package="foo.package"></context:component-scan>
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
Run Code Online (Sandbox Code Playgroud)

提交表单确实可以访问addFileSystemImage方法.locId参数的数据在此处,但"files"参数未绑定.无论我尝试过什么参数/字段名称/参数类型的组合,它都是系统无效的.

HttpServletRequest参数是org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest,它包含一个实际保存文件数据的multiPartFile属性.看看它在调试中的价值给了我

{files[]=[org.springframework.web.multipart.commons.CommonsMultipartFile@16afd7f9, org.springframework.web.multipart.commons.CommonsMultipartFile@728c2811, org.springframework.web.multipart.commons.CommonsMultipartFile@4f9aaed7]}
Run Code Online (Sandbox Code Playgroud)

这意味着我的文件[]确实在这里......但不知怎的,它没有正确地传递数据绑定步骤...

现在......我知道你会告诉我我可以从请求中检索数据......但我宁愿让它正常工作... Sring方式...... :)并且正确地使用MultipartFile的ArrayList填充.

我错过了什么吗?有没有人真正做好这项工作?如何填充此ArrayList(甚至是常规数组)?

我在这个解决方案中遇到了一个 带有ajax文件上传的Spring MVC和MultipartFile,它与我做的几乎完全相同,但显然我必须做错事,因为这个解决方案对我不起作用.

注意:我确实设法使用单个文件上传.但我今天的挑战是一次获得多个文件.

任何帮助赞赏.

提前致谢.

Met*_*002 6

虽然你已经得到了Alex的回答,但我想详细说明一下.使用Spring绑定,表单字段绑定到HTML中的"名称"属性.因为不可能有一个名为 files [] 的表单字段(如果一个声明一个带有该语法的变量名,它的名字是文件,但它是一个声明类型的数组),Spring无法匹配它 - 和在这种情况下的行为是忽略请求中的数据.

使用诸如MultipartFile之类的类型,您可以使用名为"files"的List或数组作为以下示例:

private List<MultipartFile> files;
private MultipartFile[] files;
Run Code Online (Sandbox Code Playgroud)

使用适当的getter和setter,您可以相应地访问和更改文件列表.


ger*_*tan 0

已包含 commons-fileupload 依赖项?

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我测试了即使使用 ArrayList 作为控制器处理程序上的参数类型,文件上传也能正常工作