multipart格式
的數據會將一個表單拆分爲多個部分(part),每個部分對應一個輸入域。在一般的表單輸入域中,它所對應的部分中會放置文本型數據,但是如果上傳文件的話,它所對應的部分可以是二進制,下面展現了 multipart格式
的請求體:
1、配置 multipart 解析器
要配置一個multipart解析器,通過它來告訴DispatcherServlet該如何讀取multipart請求。
Spring 內置了兩個MultipartResolver的實現:
- CommonsMultipartResolver:使用Jakarta Commons FileUpload解析multipart請求;
- StandardServletMultipartResolver:依賴於Servlet 3.0對multipart請求的支持(始於Spring 3.1)。
StandardServletMultipartResolver的配置:
@Bean(name = "multipartResolver")
public StandardServletMultipartResolver getStandardServletMultipartResolver(){
return new StandardServletMultipartResolver();
}
配置了繼承AbstractAnnotationConfigDispatcherServletInitializer的DispatcherServlet 的 servlet 初始化類,通過重載customizeRegistration()方法來配置multipart的具體細節:
/*
* 將上傳文件的臨時存儲目錄設置在“d:/tmp/spittr/uploads”中
*/
@Override
protected void customizeRegistration(Dynamic registration) {
// 參數二:限制文件大小不超過2M,參數三:整個個請求不超過4M,參數三:“0”所有的文件都要寫在磁盤上。
registration.setMultipartConfig(
new MultipartConfigElement("d:/tmp/spittr/uploads", 2097152, 4194304, 0));
//registration.setLoadOnStartup(); // 設置 load-on-startup優先級
//registration.setInitParameter(); // 設置初始化參數
}
在控制器方法參數上添加@RequestPart註解:
@PostMapping
public String processUpload(@RequestPart("file") MultipartFile file) {
System.out.println("----> " + file.getName() + " :: " + file.getSize());
return "redirect:/";
}
Multipart接口概況:
package org.springframework.web.multipart;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public interface MultipartFile {
String getName();
String getOriginalFilename();
String getContentType();
boolean isEmpty();
long getSize();
byte[] getBytes() throws IOException;
InputStream getInputStream() throws IOException;
void transferTo(File dest) throws IOException;
}