2013-02-17 51 views
12

我想用@Controller和@RequestMapping使用弹簧3.1.2上传多个文件。春季MVC多文件上传与HTML5多文件格式功能

这是我做的和我的配置。

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 

} 

我的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> 

提交表单并得到了addFileSystemImage方法。 locId参数的数据在这里,但“文件”参数没有绑定。无论我尝试过的参数/字段名称/参数类型的组合如何,它都是系统化的。

HttpServletRequest参数是一个org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest,它包含一个multiPartFile属性,它实际上包含文件数据。看着它在调试值给我

{files[]=[[email protected]6afd7f9, [email protected]28c2811, [email protected]f9aaed7]} 

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

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

我缺少的东西?有没有人真正做到这一点?我能做些什么来让这个ArrayList(或者甚至是一个常规的数组)被填充?

我来到这个解决方案 Spring MVC with ajax file upload and MultipartFile它与我做的事情几乎一样,但显然我必须做错事,因为这个解决方案不适合我。

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

任何帮助表示赞赏。

在此先感谢。

+9

您是否尝试将“files”参数声明为List或Multipart []文件?我不认为Spring支持列表是一个ArrayList,并且当Spring尝试绑定方法参数时可能会失败。 – 2013-02-17 19:13:32

+0

我设法得到了这样的工作在过去。我记得你还必须在你的pom中包含commons-fileupload依赖。也许试试? – gerrytan 2013-02-18 04:10:50

+0

愚蠢的我......它和List和Array一起工作......我一定失去了在所有测试过程中所做的事......感谢Alex。你可以回答这个问题,如果你愿意,我会给你点。干杯! – azpublic 2013-02-18 08:19:53

回答

0

已包含commons-fileupload的依赖关系吗?

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

我测试的文件上传工作正常,即使ArrayList中作为控制器处理器

5

虽然你已经得到了你的答案感谢Alex参数类型,我只是想详细一点。使用Spring绑定,表单字段绑定到HTML中的“名称”属性。由于不可能有一个名为的表单域[](如果用这种语法声明了一个变量名,它的名字是文件,但它是一个声明类型的数组),Spring无法匹配它 - 在这种情况下的行为是忽略请求中的数据。

使用类型,如MultipartFile,你可以使用一个列表命名为“文件”或数组如下面的例子:

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

通过适当的getter和setter方法,你就可以访问和变异文件相应列出。