Spring之配置multipartResolver解析器、上傳文件、處理文件過(guò)程
multipart格式的數(shù)據(jù) 會(huì)將 一個(gè)表單拆分為 多個(gè)部分,每個(gè)部分對(duì)應(yīng)一個(gè)輸入域。
在一般的表單輸入域中,它所對(duì)應(yīng)的部分中會(huì)放置文本型數(shù)據(jù),但是如果上傳文件的話,它所對(duì)應(yīng)的部分可以是二進(jìn)制。
配置 multipart 解析器:
有兩個(gè):
CommonsMultipartResolver:使用 Jakarta Commons FileUpload 解析 multiparty。StandardServletMultipartResolver:依賴于 Servlet 3.0 對(duì) multipart 請(qǐng)求的支持。
配置 StandardServletMultipartResolver 解析器
1、在ApplicationContext 中聲明為 bean:
@Bean
public MultipartResolver multipartResolver(){
return new StandardServletMultipartResolver();
}
2、在 web.xml 或 Servlet 初始化類中,配置 multipart 的具體細(xì)節(jié),如:文件大寫,臨時(shí)文件路徑等。
- 如果已經(jīng)實(shí)現(xiàn)了 WebApplicationInitializer 接口,可以在Servlet registration 上調(diào)用
setMultipartConfig()方法進(jìn)行配置:
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
ServletRegistration.Dynamic registration = servletContext.addServlet("appServlet", dispatcherServlet);
registration.addMapping("/");
registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads"));
}
- 若 初始化 類 繼承了
AbstractAnnotationConfigDispatcherServletInitializer或AbstractDispatcherServletInitializer通過(guò)重寫customizeRegistration方法 來(lái)配置multipart的具體細(xì)節(jié)
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
registration.setMultipartConfig(
new MultipartConfigElement("/tmp/test/uploads")
);
}
了解 MultipartConfigElement 類:
new MultipartConfigElement("/tmp/test/uploads",2097152,4194304,0)
- 指定 臨時(shí)存放目錄 為
/tmp/test/uploads。 - 上傳文件的最大容量:
2097152= 2MB。 - 整個(gè) multipart 請(qǐng)求的最大容量
4194304= 4MB。 - 文件大寫 達(dá)到一定容量,會(huì)寫入 臨時(shí)文件路徑中,默認(rèn)是 0,所有上傳的文件都會(huì)寫入磁盤中。
對(duì)應(yīng) 在 web.xml 中的配置:
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!-- 臨時(shí)路勁 -->
<location>/tmp/test/uploads</location>
<!-- 上傳文件的最大值 -->
<max-file-size>2097152</max-file-size>
<!--請(qǐng)求的最大容量-->
<max-request-size>4194304</max-request-size>
</multipart-config>
</servlet>
配置 CommonsMultipartResolver 解析器
聲明為 bean
@Bean
public MultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}
文件大小,臨時(shí)路徑等在 聲明Bean 時(shí)設(shè)置。
@Bean
public MultipartResolver multipartResolver() throws IOException {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
// 設(shè)置 臨時(shí)目錄
multipartResolver.setUploadTempDir(new FileSystemResource("/tmp/test/uploads"));
// 最大文件
multipartResolver.setMaxUploadSize(2097152);
multipartResolver.setMaxInMemorySize(0);
return multipartResolver;
}
上傳文件、處理文件
表單的大體樣式:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="picture" accept="image/jpeg">
<input type="submit" value="提交">
</form>
enctype="multipart/form-data"告訴 瀏覽器以 multipart 數(shù)據(jù)的形式提交表單。accept="image/jpeg"限制文件接收的類型 為 JPEG。
Controller 上接收上傳的文件
@RequestMapping("/upload")
public String uploadImage(@RequestPart("picture")MultipartFile file) throws IOException {
// 獲取 文件 名
String filename = file.getOriginalFilename();
// 將 上傳的文件 寫入到 文件系統(tǒng)中
file.transferTo(new File("/data/image"+filename));
return "index";
}
- MultipartFile 接口,為處理 multipart 數(shù)據(jù)提供了內(nèi)容更為豐富的對(duì)象。
public interface MultipartFile extends InputStreamSource {
String getName();
@Nullable
String getOriginalFilename();
@Nullable
String getContentType();
boolean isEmpty();
long getSize();
byte[] getBytes() throws IOException;
InputStream getInputStream() throws IOException;
default Resource getResource() {
return new MultipartFileResource(this);
}
void transferTo(File var1) throws IOException, IllegalStateException;
default void transferTo(Path dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
}
}
可以把 MultipartFile 替換為 Servlet.http.Part
@RequestMapping("/upload")
public String uploadImage(@RequestPart("picture") Part file) throws IOException {
// 獲取 文件 名
String filename = file.getSubmittedFileName();
// 將 上傳的文件 寫入到 文件系統(tǒng)中
file.write("/data/image"+filename);
return "index";
}
通過(guò) Part 參數(shù)接收上傳文件,那么沒(méi)有必要 配置 MultipartResolver 了。只有使用 MultipartFile 的時(shí)候,才需要 配置。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)單美女拼圖游戲
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單美女拼圖游戲的相關(guān)資料,需要的朋友可以參考下2015-03-03
springboot基于IDEA環(huán)境熱加載與熱部署教程
這篇文章主要為大家介紹了springboot在IDEA環(huán)境下的熱加載與熱部署教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
SpringBoot整合BCrypt實(shí)現(xiàn)密碼加密
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合BCrypt進(jìn)行密碼加密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Spring Boot 與 Kotlin 上傳文件的示例代碼
這篇文章主要介紹了Spring Boot 與 Kotlin 上傳文件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Lombok插件有望被Intellij IDEA收編以改善兼容性問(wèn)題(推薦)
這篇文章主要介紹了Lombok插件有望被Intellij IDEA收編以改善兼容性問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java Javassist輕松操作字節(jié)碼的技術(shù)指南
Javassist 是一個(gè) Java 庫(kù),允許你在運(yùn)行時(shí)定義新類或修改現(xiàn)有類文件,本文主要為大家詳細(xì)介紹了如何使用Javassist輕松操作字節(jié)碼,感興趣的小伙伴可以參考一下2025-04-04

