SpringMVC内置了对文件上传的支持,它需要我们配置一个MultipartResolver,Servlet3之前它只有一个基于commons-fileupload的实现CommonsMultipartResolver,笔者以前也写过一篇基于CommonsMultipartResolver的文件上传的博文,地址是http://elim.iteye.com/blog/1188116。Servlet3之后SpringMVC提供了另一个基于Servlet3的文件上传的实现,叫StandardServletMultipartResolver。本文将只介绍基于Servlet3的文件上传支持,作为以前写的基于commons-fileupload的实现的博文的一个补充。
首先需要定义一个StandardServletMultipartResolver类型的bean,对应的id默认情况下必须为multipartResolver,具体可以查看DispatcherServlet.initMultipartResolver()。
<!-- 上传文件的解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>
然后需要启用Servlet3的文件上传支持,需要我们在web.xml中定义DispatcherServlet时定义<multipart-config/>
,如果是基于注解配置的,则需要使用@javax.servlet.annotation.MultipartConfig
。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 启用Servlet3文件上传支持 -->
<multipart-config>
<file-size-threshold>512000</file-size-threshold>
<location></location>
<max-file-size></max-file-size>
<max-request-size></max-request-size>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
启用了基于Servlet3的文件上传支持时,我们在Controller中有四种方式来接收上传的文件。
- 通过Spring的org.springframework.web.multipart.MultipartFile直接接收。
- 通过Servlet3提供的javax.servlet.http.Part接收。
- 通过Spring的org.springframework.web.multipart.MultipartHttpServletRequest的getFile()获取。
- 通过Servlet3的javax.servlet.http.HttpServletRequest的getPart()获取。
@RequestMapping(value="doupload", method=RequestMethod.POST)
@ResponseBody
public Object doUpload(@RequestParam("file1") MultipartFile file1,
@RequestParam("file2") Part file2,
MultipartHttpServletRequest multiRequest, HttpServletRequest request)
throws Exception {
//保存文件
Map<String, Object> result = new HashMap<>();
result.put("file1.contentType", file1.getContentType());
result.put("file1.size", file1.getSize());
result.put("file2.contentType", file2.getContentType());
result.put("file2.size", file2.getSize());
//其它信息可以参考各自的API
//也可以通过MultipartHttpServletRequest的API获取文件
file1 = multiRequest.getFile("file1");//获取file1
file1 = multiRequest.getFile("file2");//获取file2
MultiValueMap<String, MultipartFile> multiFileMap
= multiRequest.getMultiFileMap();//所有的文件
//如果是基于Servlet3的文件上传,也可以通过HttpServletRequest获取文件
file2 = request.getPart("file1");
file2 = request.getPart("file2");
Collection<Part> parts = request.getParts();//获取所有的文件
if (multiFileMap != null && parts != null) {
}
return result;
}
(本文是基于Spring4.1.0所写)