Spring 中 MultipartResolver

今天看了一下,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”,最好是方法項目中,然後讀取就不會出現這個錯了)

發佈了23 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章