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)求。

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

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

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

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

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

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

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

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