天天看點

Spring檔案上傳功能源碼剖析

Spring預設提供了檔案上傳的功能。用起來非常簡單,我們也可以使用第三方的如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檔案中寫好相應的映射,上傳檔案的内容可以通過MultiPartFile來擷取位元組流并處理

@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可以檢測到目前的請求是否為MultiPart請求。

Spring檔案上傳功能源碼剖析

DispatchServlet

2、如果檢測為MultiPart請求,則去解析MultiPart請求

Spring檔案上傳功能源碼剖析

2.1 判斷是否為MultiPart請求

Spring檔案上傳功能源碼剖析

StandardServletMultipartResolver

2.2 解析MultiPart請求。

Spring檔案上傳功能源碼剖析

3、具體解析流程。Part為底層原生的API,可以通過HttpServletRequest直接調用。然後将請求的Part參數封裝起來。

Spring檔案上傳功能源碼剖析

StandardMultipartHttpServletRequest

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

Spring檔案上傳功能源碼剖析

表單請求部分

4、建立了MultiPartFile實作。前端表單上傳的MultiPart部分都從Part擷取。

Spring檔案上傳功能源碼剖析

StandardMultipartFile

5、在Controller中則可以使用參數映射來擷取上傳的MultiPart部分。

Spring檔案上傳功能源碼剖析

Controller檔案

小結

這次主要解析了StandardServletMultipartResolver,關于Apache下的CommonsMultipartResolver處理過程也大體相當,可自行解析。通過這次分析在背景解析檔案的請求處理上,可定制更加靈活的方案來處理。

下一篇: 學習回應