SpringBoot中的文件上傳和異常處理詳解
文件上傳
前端表單
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>后臺(tái)接收
/**
* MultipartFile 自動(dòng)封裝上傳過來的文件
* @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";
}配置原理
**文件上傳自動(dòng)配置類-MultipartAutoConfiguration-**MultipartProperties
- 自動(dòng)配置好了 StandardServletMultipartResolver 【文件上傳解析器】
1 請(qǐng)求進(jìn)來使用文件上傳解析器判斷(isMultipart)并封裝(resolveMultipart,返回MultipartHttpServletRequest)文件上傳請(qǐng)求
2 參數(shù)解析器來解析請(qǐng)求中的文件內(nèi)容封裝成MultipartFile
3 將request中文件信息封裝為一個(gè)Map
異常處理
錯(cuò)誤處理
默認(rèn)規(guī)則
默認(rèn)情況下,Spring Boot提供 /error 處理所有錯(cuò)誤的映射
對(duì)于機(jī)器客戶端,它將生成JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息。對(duì)于瀏覽器客戶端,響應(yīng)一個(gè)“ whitelabel”錯(cuò)誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù)
要對(duì)其進(jìn)行自定義,添加 View 解析為 error
- 要完全替換默認(rèn)行為,可以實(shí)現(xiàn) ErrorController 并注冊(cè)該類型的Bean定義,或添加 ErrorAttributes類型的組件 以使用現(xiàn)有機(jī)制但替換其內(nèi)容
- error/下的4xx,5xx頁(yè)面會(huì)被自動(dòng)解析
定制錯(cuò)誤處理邏輯
自定義錯(cuò)誤頁(yè):
- error/404.html error/5xx.html;有精確的錯(cuò)誤狀態(tài)碼頁(yè)面就匹配精確,沒有就找 4xx.html;如果都沒有就觸發(fā)白頁(yè)
@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請(qǐng)求就會(huì)轉(zhuǎn)給controller
- 異常沒有任何人能處理。tomcat底層 response.sendError。error請(qǐng)求就會(huì)轉(zhuǎn)給controller
- basicErrorController 要去的頁(yè)面地址是 ErrorViewResolver
異常處理自動(dòng)配置原理
ErrorMvcAutoConfiguration 自動(dòng)配置異常處理規(guī)則
- 容器中的組件:類型:DefaultErrorAttributes -> id:errorAttributes
- DefaultErrorAttributes 定義錯(cuò)誤頁(yè)面中可以包含哪些數(shù)據(jù)
- **容器中的組件:類型:**BasicErrorController --> id:basicErrorController(json+白頁(yè) 適配響應(yīng))
- 處理默認(rèn) /error 路徑的請(qǐng)求;頁(yè)面響應(yīng) new ModelAndView(“error”, model);
- 容器中有組件 View->id是error;(響應(yīng)默認(rèn)錯(cuò)誤頁(yè))
- 容器中放組件 BeanNameViewResolver(視圖解析器);按照返回的視圖名作為組件的id去容器中找View對(duì)象
- **容器中的組件:**類型:**DefaultErrorViewResolver -> id:**conventionErrorViewResolver
- 如果發(fā)生錯(cuò)誤,會(huì)以HTTP的狀態(tài)碼 作為視圖頁(yè)地址(viewName),找到真正的頁(yè)面
- error/404、5xx.html
異常處理流程
1 執(zhí)行目標(biāo)方法,目標(biāo)方法運(yùn)行期間有任何異常都會(huì)被catch、而且標(biāo)志當(dāng)前請(qǐng)求結(jié)束;并且用 dispatchException
2 進(jìn)入視圖解析流程(頁(yè)面渲染)
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)沒有任何人能處理異常,所以異常會(huì)被拋出
- 沒有任何人能處理最終底層就會(huì)發(fā)送 /error 請(qǐng)求。會(huì)被底層的BasicErrorController處理
- 解析錯(cuò)誤視圖;遍歷所有的 ErrorViewResolver 看誰能解析
- 默認(rèn)的 DefaultErrorViewResolver ,作用是把響應(yīng)狀態(tài)碼作為錯(cuò)誤頁(yè)的地址,error/500.html
- 模板引擎最終響應(yīng)這個(gè)頁(yè)面 error/500.html
到此這篇關(guān)于SpringBoot中的文件上傳和異常處理詳解的文章就介紹到這了,更多相關(guān)SpringBoot文件上傳和異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+ruoyi框架文件上傳和下載的實(shí)現(xiàn)
- SpringBoot實(shí)現(xiàn)文件上傳下載實(shí)時(shí)進(jìn)度條功能(附源碼)
- SpringBoot簡(jiǎn)單實(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)文章
Java版本怎么選以及JDK各版本特性對(duì)比與實(shí)戰(zhàn)建議
Java是一種廣泛使用的編程語言,擁有一個(gè)龐大的社區(qū)和大量的生態(tài)系統(tǒng),自從Java的早期版本以來,它已經(jīng)經(jīng)歷了許多變化和改進(jìn),這篇文章主要介紹了Java版本怎么選以及JDK各版本特性對(duì)比與實(shí)戰(zhàn)建議的相關(guān)資料,需要的朋友可以參考下2025-11-11
Spring如何在一個(gè)事務(wù)中開啟另一個(gè)事務(wù)
這篇文章主要介紹了Spring如何在一個(gè)事務(wù)中開啟另一個(gè)事務(wù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Java8函數(shù)式編程應(yīng)用小結(jié)
Java8非常重要的就是引入了函數(shù)式編程的思想,使得這門經(jīng)典的面向?qū)ο笳Z言有了函數(shù)式的編程方式,彌補(bǔ)了很大程度上的不足,函數(shù)式思想在處理復(fù)雜問題上有著更為令人稱贊的特性,本文給大家介紹Java8函數(shù)式編程應(yīng)用小結(jié),感興趣的朋友一起看看吧2023-12-12
ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解
這篇文章主要為大家介紹了ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Spring?Cloud?Sleuth?和?Zipkin?進(jìn)行分布式跟蹤使用小結(jié)
分布式跟蹤是一種機(jī)制,我們可以使用它跟蹤整個(gè)分布式系統(tǒng)中的特定請(qǐng)求,分布式跟蹤允許您跟蹤分布式系統(tǒng)中的請(qǐng)求,本文給大家介紹Spring?Cloud?Sleuth?和?Zipkin?進(jìn)行分布式跟蹤使用小結(jié),感興趣的朋友一起看看吧2022-03-03
Java C++題解leetcode1620網(wǎng)絡(luò)信號(hào)最好的坐標(biāo)
這篇文章主要為大家介紹了Java C++題解leetcode1620網(wǎng)絡(luò)信號(hào)最好的坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
淺談SpringBoot在使用測(cè)試的時(shí)候是否需要@RunWith
本文主要介紹了淺談SpringBoot在使用測(cè)試的時(shí)候是否需要@RunWith,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

