這兩天在用spring進行上傳上遇到問題,今天進行了問題的排查,這個過程也增加了我看spring源碼的興趣!還是很有收獲的!
首先先給A組提供了上傳接口,并沒有在spring的配置文件進行multipartResolver的配置,后臺Controller的java的獲取為:
/**
*Saves temporary files to the servlet container's temporary directory. Needs to be initialized either by an application context or via the constructor that takes a ServletContext (for standalone usage).一個是Spring容器(Servlet容器的子容器),另一個是Servlet容器
*/
spring是前端還是后端、MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
String a1?= multipartRequest.getParameter("a1");
將request請求的上下文轉換為MultipartResolver,然后轉換為MultipartHttpServletRequest請求,通過multi請求就可以獲取對應的file文件信息,這樣的方法沒有問題,后臺能獲取到相應的參數;
稍后組里另一個同事也用到上傳,基于網上查的資料,認為應該把配置文件給加上去了,于是問題出來了,也造成了我記錄該博客的原因:
idea普通java項目怎么添加jar包,10485760000
4096
進行該配置后,我在后臺的該方法獲取file為空造成了上傳錯誤,剛開始我也納悶,按道理spring的上傳應該需要這樣的配置,同事也是覺得我大意了沒有進行配置好心給我進行了修改,但是反而造成了bug,線下環境測試將該配置去除功能ok。好了,做了這么多年開發,不能因為fixed bug而不進行原理的問題查看,這樣的修改連自己都過不去。
搜了資料,做了測試,有了以下的總結,有問題歡迎大家拍磚!
最后上傳問題的方案:
(一):
java throwable。1、在spring-config配置了?之后
后臺的獲取有兩種方法:
1、指定@RequestParam MultipartFile file 例如:public Map logsUpload(@RequestParam MultipartFile file,@RequestParam(value="key") String key)參數;
2、將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());
java default package、MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
是獲取不到file的,因為控制器已經幫我們進行了轉換 直接獲取即可。
如果你使用該方法發覺獲取沒有問題,你可以看看給這個方法是不是配置了servlet,如果配置了servlet是不走這個?MultipartResolver控制,是能獲取成功的。
(二)
無需進行spring-config的配置,直接在后臺獲取進行轉換即可,也就是我最初的寫法。
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
java后端開發都有什么技術?MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
String key = multipartRequest.getParameter("key");
然后項目具體需要什么樣的修改,自己結合業務斟酌即可。
自己講的不深,看了很多文章資料,也是這篇給的啟迪最大:
http://exceptioneye.iteye.com/blog/1314958
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态