spring是前端還是后端,java取multipart_spring的multipartResolver和java后端獲取的MultipartHttpServ

 2023-10-24 阅读 22 评论 0

摘要:這兩天在用spring進行上傳上遇到問題,今天進行了問題的排查,這個過程也增加了我看spring源碼的興趣!還是很有收獲的!首先先給A組提供了上傳接口,并沒有在spring的配置文件進行multipartResolver的配置,后臺Controller的java的獲取為

這兩天在用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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/163533.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息