Spring文件上傳功能源碼剖析

Spring默認(rèn)提供了文件上傳的功能。用起來非常簡(jiǎn)單,我們也可以使用第三方的如Apache的CommonsUpload包來處理。這里我們使用Spring自帶的解析。

基本用法

1、在Spring配置中,加上MultipartResolver接口的Bean。

@Bean(
    name = {"multipartResolver"}
)
@ConditionalOnMissingBean({MultipartResolver.class})
public StandardServletMultipartResolver multipartResolver() {
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
    return multipartResolver;
}

2、前端表單類型method為POST方法,enctype為”multipart/form-data”

<form method="post" action="/form" enctype="multipart/form-data"> 
  <input type="text" name="name"/> 
  <input type="file" name="file"/> <input type="submit"/> 
</form>

3、Controller文件中寫好相應(yīng)的映射,上傳文件的內(nèi)容可以通過MultiPartFile來獲取字節(jié)流并處理

   
    @PostMapping("/form")
    public String handleFormUpload(
            @RequestParam("name") String name,
            @RequestParam("file") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // store the bytes somewhere return "redirect:uploadSuccess"; 
        }
        return "redirect:uploadFailure";
    }

原理

1、Spring的DispatchServlet可以檢測(cè)到當(dāng)前的請(qǐng)求是否為MultiPart請(qǐng)求。


DispatchServlet


2、如果檢測(cè)為MultiPart請(qǐng)求,則去解析MultiPart請(qǐng)求


DispatchServlet

2.1 判斷是否為MultiPart請(qǐng)求

StandardServletMultipartResolver

2.2 解析MultiPart請(qǐng)求。

StandardServletMultipartResolver

3、具體解析流程。Part為底層原生的API,可以通過HttpServletRequest直接調(diào)用。然后將請(qǐng)求的Part參數(shù)封裝起來。

StandardMultipartHttpServletRequest

3.1 我們可以看到前端mutipart/form-data上傳請(qǐng)求的類型為


表單請(qǐng)求部分

4、創(chuàng)建了MultiPartFile實(shí)現(xiàn)。前端表單上傳的MultiPart部分都從Part獲取。

StandardMultipartFile

5、在Controller中則可以使用參數(shù)映射來獲取上傳的MultiPart部分。


Controller文件

小結(jié)

這次主要解析了StandardServletMultipartResolver,關(guān)于Apache下的CommonsMultipartResolver處理過程也大體相當(dāng),可自行解析。通過這次分析在后臺(tái)解析文件的請(qǐng)求處理上,可定制更加靈活的方案來處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容