springMVC中配置CommonsMultipartResolver,介绍MultipartResolver的使用
一、MultipartResolver的配置综述
MultipartResolver是专门处理文件上传的一个类,比如我们在前台上传文件到如FTP服务器。
MultipartResolver的使用:
使用MultipartResolver需要在pom中引入两个包:
1 <!-- 文件上传的相关 --> 2 <dependency> 3 <groupId>commons-fileupload</groupId> 4 <artifactId>commons-fileupload</artifactId> 5 <version>1.2.2</version> 6 </dependency> 7 <dependency> 8 <groupId>commons-io</groupId> 9 <artifactId>commons-io</artifactId> 10 <version>2.0.1</version> 11 </dependency>
同时使用MultipartResovler需要在springMVC的配置文件dispatcher-Servlet.xml中进行以下的配置:
1 <!--配置文件上传相关--> 2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 3 <!-- 设定文件上传的最大值--> 4 <property name="maxUploadSize" value="10485760"></property> 5 <!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 --> 6 <property name="maxInMemorySize" value="4096"></property> 7 <!-- 设定默认编码 --> 8 <property name="defaultEncoding" value="UTF-8"></property> 9 </bean>
当我们发起请求的时候会通过dispatcher-Servlet来拦截请求,DispatcherServlet.java中的checkMultipart方法会调用MultipartResovler类中的isMultipart()方法来判断请求中是否带有文件,返回boolean的值。
1 protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
2 if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
3 if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {
4 logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " +
5 "this typically results from an additional MultipartFilter in web.xml");
6 }
7 else if (hasMultipartException(request) ) {
8 logger.debug("Multipart resolution failed for current request before - " +
9 "skipping re-resolution for undisturbed error rendering");
10 }
11 else {
12 try {
13 return this.multipartResolver.resolveMultipart(request);
14 }
15 catch (MultipartException ex) {
16 if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) != null) {
17 logger.debug("Multipart resolution failed for error dispatch", ex);
18 // Keep processing error dispatch with regular request handle below
19 }
20 else {
21 throw ex;
22 }
23 }
24 }
25 }
26 // If not returned before: return original request.
27 return request;
28 }
1 boolean isMultipart(HttpServletRequest request);
如果解析到请求中包含的有文件的话就会调用MultipartResovler类的resolveMultipart()方法。
1 MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;
然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest对象中,最后传递给 Controller。
1 public interface MultipartHttpServletRequest extends HttpServletRequest, MultipartRequest
二、MultipartResolver的使用简例:
往往我们在前台通过springMVC实现表单提交的方式来上传文件:
1 <form action="${pageContext.request.contextPath}/请求接口" method="post" enctype="multipart/form-data">
2 <input type="file" name="file">
3 <input type="submit" value="提交">
4 </form>