弹簧MVC多文件上传与HTML5多文件格式功能

2022-09-04 22:55:13

我正在尝试使用带有@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>

控制器方法:

@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  

}

我的会议 :

 <mvc:annotation-driven />
 <context:component-scan base-package="foo.package"></context:component-scan>
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

提交表单确实会转到 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]}

这意味着我的文件[]确实在这里...但不知何故,它没有正确通过数据绑定步骤...

现在。。。我知道你会告诉我,我可以从请求中检索数据...但我宁愿让它正常工作...拧紧针的方式... :)并正确填充我的多部分文件的 ArrayList。

我错过了什么吗?有没有人真正正确地完成了这项工作?我该怎么做才能填充此数组列表(甚至是常规数组)?

我遇到了这个解决方案 Spring MVC 与 ajax 文件上传和 MultipartFile 它所做的几乎与我相同,但显然我一定是做错了什么,因为这个解决方案不适合我。

注意:我确实设法让它与单个文件上传一起工作。但我今天的挑战是一次获取多个文件。

任何帮助赞赏。

提前致谢。


答案 1

虽然多亏了亚历克斯,你已经得到了你的答案,但我只想详细阐述一下。使用Spring绑定,表单字段绑定到HTML中的“name”属性。由于不可能有一个名为 files[] 表单字段(如果使用该语法声明变量名称,则其名称为 files,但它是声明类型的数组),因此 Spring 无法匹配它 - 在这种情况下,行为是忽略请求中的数据。

使用诸如多部分文件之类的类型,可以使用名为“files”的列表或数组,如以下示例所示:

private List<MultipartFile> files;
private MultipartFile[] files;

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


答案 2

是否包含共享资源-文件上传依赖关系?

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3</version>
</dependency>

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