今天看了一下,MultipartResolver,總結一下
spring的MultipartResolver可以幫助上傳文件,
先看定義
public interface MultipartResolver {
boolean isMultipart(HttpServletRequest request);
MultipartHttpServletRequest resolverMultipart(HttpServletRequest request);
void cleanupMultipart(MultipartHttpServletRequest request);
}
當用戶的請求到DispatcherServlet時,
1, DispatcherServlet會先在webapplicationContext.xml中找一個名爲“multipartResolver”的bean.
2, 如果有,則調用MultipartResolver的第一個方法,該方法會返回這個請求是否是通過enctype=”multipart/form-data”方式提交的,如果是,則調用第二個方法的,這個方法會把當前的HttpServletRequest換成MultipartHttpServletRequest,並傳給後面的Controller處理
3, 如果沒有這個bean(也可以修改DispatcherServlet的 MULTIPART_RESOLVER_BEAN_NAME屬性來修改查找的名字),或者第一個方法沒有返回true,則不做處理,繼續傳遞HttpServletRequest
大費周章把HttpServletRequest換成MultipartHttpServletRequest,再來看看spring怎麼定義這個HttpServletRequest的,
public interface MultipartHttpServketRequest extends HttpServletRequest,MultiPartRequest{
}
public interface MultipartRequest{
Iterator getFileNames();
MultipartFile getFile(String name);
Map getFileMap();
}
MultipartHttpServletRequest的附加能力來自父接口,
簡單的說現在處理文件上傳的Controller可以直接通過
MultipartHttpServletRequest request = (MultipartHttpServletRequest)request;
MultipartFile file = request.getFile("fileName");
得到上傳的文件,之後怎麼操作就看你的需要
而當你使用玩MultipartResolver後,DispatcherServlet將保證調用,該接口的第三個方法,來釋放系統資源,這樣也大大方便了。
spring爲MultipartResolver提供兩個可用的實現類:
org.springframework.web.multipart.commons.CommonsMultipartResolver(CommonsFileUpload類庫實現,要倒包)
org.springframework.web.multipart.cos.CosMultipartResolver(OreillyCos類庫實現,倒包)
當然這兩個類其中還有一些屬性,來控制文件上傳的行爲,比如: “maxUploadSize”, “maxInMemorySize” and “defaultEncoding”
這些屬性都是繼承來的,如圖
如果不去關心細節的話,簡單的用法就這樣。(還是應該多看源碼。。o.o)
望道友指正!
(還有一個,以前上傳圖片的時候都是上傳到項目之外的其他盤,今天發現一個問題,在網絡上讀服務器其他盤的圖片的時候有個小問題,當你在其他電腦上傳後讀取圖片的時候,瀏覽器會出現“Not allowed to load local resource”,最好是方法項目中,然後讀取就不會出現這個錯了)