Spring MVC 多文件上传与 HTML5 多文件表单功能
Posted
技术标签:
【中文标题】Spring MVC 多文件上传与 HTML5 多文件表单功能【英文标题】:Spring MVC multiple file upload with HTML5 multiple file form feature 【发布时间】:2013-02-02 04:55:34 【问题描述】:我正在尝试使用带有 @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 参数的数据在这里,但“文件”参数未绑定。无论我尝试过哪种参数/字段名称/参数类型的组合,它都系统地为空。
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]
这意味着我的 files[] 确实在这里......但不知何故它没有正确通过数据绑定步骤......
现在......我知道你会告诉我我可以从请求中检索数据......但我宁愿让它正常工作...... Sring 方式...... :) 并拥有我的 ArrayList MultipartFile 正确填充。
我错过了什么吗?有没有人真正使这项工作正常进行?我能做些什么来填充这个 ArrayList (甚至是一个常规的 Array )?
我遇到了这个解决方案 Spring MVC with ajax file upload and MultipartFile 和我做的事情几乎一样,但显然我一定做错了,因为这个解决方案不适合我。
注意:我确实设法让它与单个文件上传一起工作。但我今天的挑战是一次获取多个文件。
任何帮助表示赞赏。
提前致谢。
【问题讨论】:
您是否尝试将“files”参数声明为 List 或 Multipart[] 文件?我不认为 Spring 支持列表是 ArrayList 并且当 Spring 尝试绑定方法参数时,转换可能会失败。 过去我设法得到了类似的东西。我记得您还必须在 pom.xml 中包含 commons-fileupload 依赖项。可以试试吗? 愚蠢的我......它确实适用于列表和数组......我一定忘记了我在所有测试期间做了什么......谢谢亚历克斯。你可以回答这个问题,如果你愿意,我会给你点。干杯! 【参考方案1】:虽然感谢 Alex,您已经得到了答案,但我还是想详细说明一下。使用 Spring 绑定,表单字段被绑定到它们在 HTML 中的“名称”属性。由于不可能有一个表单字段 named files[](如果使用该语法声明一个变量名,它的名称是 files,但它是一个声明类型的数组),Spring 不能' t 匹配 - 在这种情况下的行为是忽略请求中的数据。
使用 MultipartFile 等类型,您可以使用名为“files”的列表或数组,如下例所示:
private List<MultipartFile> files;
private MultipartFile[] files;
使用适当的 getter 和 setter,您可以相应地访问和改变文件列表。
【讨论】:
【参考方案2】:是否包含 commons-fileupload 依赖?
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
我测试了即使将 ArrayList 作为控制器处理程序上的参数类型,文件上传也能正常工作
【讨论】:
以上是关于Spring MVC 多文件上传与 HTML5 多文件表单功能的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET MVC 中处理 HTML5 多文件上传?