這兩天在用spring進行上傳上遇到問題,今天進行了問題的排查,這個過程也增長了我看spring源碼的興趣!仍是頗有收穫的!java
首先先給A組提供了上傳接口,並無在spring的配置文件進行multipartResolver的配置,後臺Controller的java的獲取爲:web
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
String a1 = multipartRequest.getParameter("a1");spring
將request請求的上下文轉換爲MultipartResolver,而後轉換爲MultipartHttpServletRequest請求,經過multi請求就能夠獲取對應的file文件信息,這樣的方法沒有問題,後臺能獲取到相應的參數;測試
稍後組裏另外一個同事也用到上傳,基於網上查的資料,認爲應該把配置文件給加上去了,因而問題出來了,也形成了我記錄該博客的緣由:spa
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- set the max upload size100MB -->
<property name="maxUploadSize">
<value>10485760000</value>
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>blog
進行該配置後,我在後臺的該方法獲取file爲空形成了上傳錯誤,剛開始我也納悶,按道理spring的上傳應該須要這樣的配置,同事也是以爲我大意了沒有進行配置好心給我進行了修改,可是反而形成了bug,線下環境測試將該配置去除功能ok。好了,作了這麼多年開發,不能由於fixed bug而不進行原理的問題查看,這樣的修改連本身都過不去。接口
搜了資料,作了測試,有了如下的總結,有問題歡迎你們拍磚!ip
最後上傳問題的方案:開發
(一):
一、在spring-config配置了<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 以後get
後臺的獲取有兩種方法:
一、指定@RequestParam MultipartFile file 例如:public Map<String, Object> logsUpload(@RequestParam MultipartFile file,@RequestParam(value="key") String key)參數;
二、將request轉化爲MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);
原理是:使用spring的CommosMultipartResolver 配置MultipartResolver 用於文件上傳,DispatcherServlet 將調用 MultipartResolver 的 isMultipart(request) 方法檢查當前 Web 請求是否爲 multipart類型。若是是,DispatcherServlet 將調用 MultipartResolver 的 resolveMultipart(request) 方法,對原始 request 進行裝飾,並返回一個 MultipartHttpServletRequest 供後繼處理流程使用(最初的 HttpServletRequest 被偷樑換柱成了 MultipartHttpServletRequest),不然,直接返回最初的 HttpServletRequest。也就是說請求一旦被 MultipartResolver 接手,它就會解析請求中的文件,而沒必要等待後續 controller 主動從 MultipartRequest 中 getFile,因此在配置了MultipartResolver後,再經過這樣的方法
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
是獲取不到file的,由於控制器已經幫咱們進行了轉換 直接獲取便可。
若是你使用該方法發覺獲取沒有問題,你能夠看看給這個方法是否是配置了servlet,若是配置了servlet是不走這個 MultipartResolver控制,是能獲取成功的。
(二)
無需進行spring-config的配置,直接在後臺獲取進行轉換便可,也就是我最初的寫法。
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
String key = multipartRequest.getParameter("key");
而後項目具體須要什麼樣的修改,本身結合業務斟酌便可。
本身講的不深,看了不少文章資料,也是這篇給的啓迪最大:
http://exceptioneye.iteye.com/blog/1314958
最後,遇到坑要想原理好好解決!不能在停留在複製粘貼的水平了~~