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請求。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuITYmJGN0YTN2QDZ1YTO2MDNjZTYhNGM2UTO3IGZmFWYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
DispatchServlet
2、如果檢測為MultiPart請求,則去解析MultiPart請求
2.1 判斷是否為MultiPart請求
StandardServletMultipartResolver
2.2 解析MultiPart請求。
3、具體解析流程。Part為底層原生的API,可以通過HttpServletRequest直接調用。然後将請求的Part參數封裝起來。
StandardMultipartHttpServletRequest
3.1 我們可以看到前端mutipart/form-data上傳請求的類型為
表單請求部分
4、建立了MultiPartFile實作。前端表單上傳的MultiPart部分都從Part擷取。
StandardMultipartFile
5、在Controller中則可以使用參數映射來擷取上傳的MultiPart部分。
Controller檔案
小結
這次主要解析了StandardServletMultipartResolver,關于Apache下的CommonsMultipartResolver處理過程也大體相當,可自行解析。通過這次分析在背景解析檔案的請求處理上,可定制更加靈活的方案來處理。