最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中的文件上傳和異常處理詳解

 更新時(shí)間:2023年09月01日 10:11:39   作者:韓_師兄  
這篇文章主要介紹了SpringBoot中的文件上傳和異常處理詳解,對(duì)于機(jī)器客戶端,它將生成JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息,對(duì)于瀏覽器客戶端,響應(yīng)一個(gè)"whitelabel"錯(cuò)誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù),需要的朋友可以參考下

文件上傳

前端表單

<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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用反射創(chuàng)建對(duì)象示例

    Java使用反射創(chuàng)建對(duì)象示例

    這篇文章主要介紹了Java使用反射創(chuàng)建對(duì)象,結(jié)合實(shí)例形式分析了java使用反射創(chuàng)建對(duì)象的具體實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Java版本怎么選以及JDK各版本特性對(duì)比與實(shí)戰(zhà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ù)

    這篇文章主要介紹了Spring如何在一個(gè)事務(wù)中開啟另一個(gè)事務(wù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java8函數(shù)式編程應(yīng)用小結(jié)

    Java8函數(shù)式編程應(yīng)用小結(jié)

    Java8非常重要的就是引入了函數(shù)式編程的思想,使得這門經(jīng)典的面向?qū)ο笳Z言有了函數(shù)式的編程方式,彌補(bǔ)了很大程度上的不足,函數(shù)式思想在處理復(fù)雜問題上有著更為令人稱贊的特性,本文給大家介紹Java8函數(shù)式編程應(yīng)用小結(jié),感興趣的朋友一起看看吧
    2023-12-12
  • Java 實(shí)現(xiàn)多線程的幾種方式匯總

    Java 實(shí)現(xiàn)多線程的幾種方式匯總

    JAVA多線程實(shí)現(xiàn)方式主要有三種:繼承Thread類、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的。
    2016-03-03
  • ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解

    ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解

    這篇文章主要為大家介紹了ShardingSphere jdbc實(shí)現(xiàn)分庫(kù)分表核心概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java進(jìn)程間通信之消息隊(duì)列

    Java進(jìn)程間通信之消息隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了Java進(jìn)程間通信之消息隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Spring?Cloud?Sleuth?和?Zipkin?進(jìn)行分布式跟蹤使用小結(jié)

    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)

    這篇文章主要為大家介紹了Java C++題解leetcode1620網(wǎng)絡(luò)信號(hào)最好的坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 淺談SpringBoot在使用測(cè)試的時(shí)候是否需要@RunWith

    淺談SpringBoot在使用測(cè)試的時(shí)候是否需要@RunWith

    本文主要介紹了淺談SpringBoot在使用測(cè)試的時(shí)候是否需要@RunWith,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評(píng)論

同心县| 华蓥市| 托克逊县| 抚顺县| 诸暨市| 新竹市| 蓬溪县| 如东县| 务川| 天等县| 托克逊县| 商水县| 中阳县| 霍林郭勒市| 景谷| 永仁县| 深州市| 凌海市| 平潭县| 陆川县| 乌什县| 鸡西市| 峨山| 长顺县| 英山县| 肇庆市| 宁安市| 金平| 丹棱县| 株洲市| 杭锦后旗| 壶关县| 罗江县| 威宁| 五指山市| 兴化市| 潼南县| 出国| 华安县| 紫金县| 桃园市|