SpringBoot中的文件上傳和異常處理詳解
文件上傳
前端表單
<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="提交"> </form>
后臺接收
/** * MultipartFile 自動封裝上傳過來的文件 * @param email * @param username * @param headerImg * @param photos * @return */ @PostMapping("/upload") public String upload(@RequestParam("email") String email, @RequestParam("username") String username, @RequestPart("headerImg") MultipartFile headerImg, @RequestPart("photos") MultipartFile[] photos) throws IOException { log.info("上傳的信息:email={},username={},headerImg={},photos={}", email,username,headerImg.getSize(),photos.length); if(!headerImg.isEmpty()){ // 保存到文件服務(wù)器,OSS服務(wù)器 String originalFilename = headerImg.getOriginalFilename(); headerImg.transferTo(new File("D:\\cache\\"+originalFilename)); } if(photos.length > 0){ for (MultipartFile photo : photos) { if(!photo.isEmpty()){ String originalFilename = photo.getOriginalFilename(); photo.transferTo(new File("D:\\cache\\"+originalFilename)); } } } return "main"; }
配置原理
**文件上傳自動配置類-MultipartAutoConfiguration-**MultipartProperties
- 自動配置好了 StandardServletMultipartResolver 【文件上傳解析器】
1 請求進(jìn)來使用文件上傳解析器判斷(isMultipart)并封裝(resolveMultipart,返回MultipartHttpServletRequest)文件上傳請求
2 參數(shù)解析器來解析請求中的文件內(nèi)容封裝成MultipartFile
3 將request中文件信息封裝為一個Map
異常處理
錯誤處理
默認(rèn)規(guī)則
默認(rèn)情況下,Spring Boot提供 /error 處理所有錯誤的映射
對于機(jī)器客戶端,它將生成JSON響應(yīng),其中包含錯誤,HTTP狀態(tài)和異常消息的詳細(xì)信息。對于瀏覽器客戶端,響應(yīng)一個“ whitelabel”錯誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù)
要對其進(jìn)行自定義,添加 View 解析為 error
- 要完全替換默認(rèn)行為,可以實(shí)現(xiàn) ErrorController 并注冊該類型的Bean定義,或添加 ErrorAttributes類型的組件 以使用現(xiàn)有機(jī)制但替換其內(nèi)容
- error/下的4xx,5xx頁面會被自動解析
定制錯誤處理邏輯
自定義錯誤頁:
- error/404.html error/5xx.html;有精確的錯誤狀態(tài)碼頁面就匹配精確,沒有就找 4xx.html;如果都沒有就觸發(fā)白頁
@ControllerAdvice+@ExceptionHandler處理全局異常;底層是 ExceptionHandlerExceptionResolver 支持的
@ResponseStatus+自定義異常 ;底層是 ResponseStatusExceptionResolver ,把responsestatus注解的信息底層調(diào)用 response.sendError(statusCode, resolvedReason);tomcat發(fā)送的/error
Spring底層的異常,如 參數(shù)類型轉(zhuǎn)換異常
- DefaultHandlerExceptionResolver 處理框架底層的異常
自定義實(shí)現(xiàn) HandlerExceptionResolver 處理異常;可以作為默認(rèn)的全局異常處理規(guī)則
ErrorViewResolver 實(shí)現(xiàn)自定義處理異常
- response.sendError 。error請求就會轉(zhuǎn)給controller
- 異常沒有任何人能處理。tomcat底層 response.sendError。error請求就會轉(zhuǎn)給controller
- basicErrorController 要去的頁面地址是 ErrorViewResolver
異常處理自動配置原理
ErrorMvcAutoConfiguration 自動配置異常處理規(guī)則
- 容器中的組件:類型:DefaultErrorAttributes -> id:errorAttributes
- DefaultErrorAttributes 定義錯誤頁面中可以包含哪些數(shù)據(jù)
- **容器中的組件:類型:**BasicErrorController --> id:basicErrorController(json+白頁 適配響應(yīng))
- 處理默認(rèn) /error 路徑的請求;頁面響應(yīng) new ModelAndView(“error”, model);
- 容器中有組件 View->id是error;(響應(yīng)默認(rèn)錯誤頁)
- 容器中放組件 BeanNameViewResolver(視圖解析器);按照返回的視圖名作為組件的id去容器中找View對象
- **容器中的組件:**類型:**DefaultErrorViewResolver -> id:**conventionErrorViewResolver
- 如果發(fā)生錯誤,會以HTTP的狀態(tài)碼 作為視圖頁地址(viewName),找到真正的頁面
- error/404、5xx.html
異常處理流程
1 執(zhí)行目標(biāo)方法,目標(biāo)方法運(yùn)行期間有任何異常都會被catch、而且標(biāo)志當(dāng)前請求結(jié)束;并且用 dispatchException
2 進(jìn)入視圖解析流程(頁面渲染)
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
3 mv = processHandlerException;處理handler發(fā)生的異常,處理完成返回ModelAndView
- 遍歷所有的 **handlerExceptionResolvers,看誰能處理當(dāng)前異常【**HandlerExceptionResolver處理器異常解析器】
- 系統(tǒng)默認(rèn)的 異常解析器
- DefaultErrorAttributes先來處理異常。把異常信息保存到rrequest域,并且返回null;
- 默認(rèn)沒有任何人能處理異常,所以異常會被拋出
- 沒有任何人能處理最終底層就會發(fā)送 /error 請求。會被底層的BasicErrorController處理
- 解析錯誤視圖;遍歷所有的 ErrorViewResolver 看誰能解析
- 默認(rèn)的 DefaultErrorViewResolver ,作用是把響應(yīng)狀態(tài)碼作為錯誤頁的地址,error/500.html
- 模板引擎最終響應(yīng)這個頁面 error/500.html
到此這篇關(guān)于SpringBoot中的文件上傳和異常處理詳解的文章就介紹到這了,更多相關(guān)SpringBoot文件上傳和異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+ruoyi框架文件上傳和下載的實(shí)現(xiàn)
- SpringBoot實(shí)現(xiàn)文件上傳下載實(shí)時進(jìn)度條功能(附源碼)
- SpringBoot簡單實(shí)現(xiàn)文件上傳
- SpringBoot實(shí)現(xiàn)文件下載功能的方式分享
- vue+element+springboot實(shí)現(xiàn)文件下載進(jìn)度條展現(xiàn)功能示例
- springboot中Excel文件下載踩坑大全
- springboot單文件下載和多文件壓縮zip下載的實(shí)現(xiàn)
- 在 Spring Boot 項(xiàng)目中實(shí)現(xiàn)文件下載功能
- Spring Boot中進(jìn)行 文件上傳和 文件下載功能實(shí)現(xiàn)
相關(guān)文章
SpringBoot+Vue跨域配置(CORS)問題得解決過程
在使用 Spring Boot 和 Vue 開發(fā)前后端分離的項(xiàng)目時,跨域資源共享(CORS)問題是一個常見的挑戰(zhàn),接下來,我將分享我是如何一步步解決這個問題的,包括中間的一些試錯過程,希望能夠幫助到正在經(jīng)歷類似問題的你2024-08-08基于FLink實(shí)現(xiàn)實(shí)時安全檢測的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何基于FLink實(shí)現(xiàn)實(shí)時安全檢測的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下2023-02-02詳解Spring Cloud Finchley版中Consul多實(shí)例注冊的問題處理
這篇文章主要介紹了詳解Spring Cloud Finchley版中Consul多實(shí)例注冊的問題處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08JAVA初級項(xiàng)目——實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要介紹了JAVA如何實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06java中Executor,ExecutorService,ThreadPoolExecutor詳解
這篇文章主要介紹了java中Executor,ExecutorService,ThreadPoolExecutor詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02關(guān)于Spring BeanPostProcessor的執(zhí)行順序
這篇文章主要介紹了Spring BeanPostProcessor的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10