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>