多部分请求解析器 (Multipart Resolver)
MultipartResolver 用于处理包含文件上传的多部分请求(Multipart Requests)。
启用多部分解析
要启用文件上传处理,你需要在 Spring 配置中声明一个名为 multipartResolver 的 Bean。
1. 配置 Servlet 容器
首先,必须在 Servlet 容器级别开启多部分支持。
- Java 配置:在
WebApplicationInitializer中设置MultipartConfigElement。 - Spring Boot:默认已开启,可以通过
spring.servlet.multipart.*属性进行配置。
java
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
// 设置临时文件夹、单个文件大小、请求总大小等
registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads"));
}
}kotlin
class AppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
override fun customizeRegistration(registration: ServletRegistration.Dynamic) {
registration.setMultipartConfig(MultipartConfigElement("/tmp/uploads"))
}
}2. 注册 Resolver Bean
一旦容器配置完成,注册 StandardServletMultipartResolver:
java
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}处理逻辑
当 DispatcherServlet 检测到 Content-Type 为 multipart/form-data 的 POST 请求时,它会:
- 调用
multipartResolver解析请求。 - 将原始请求包装为
MultipartHttpServletRequest。 - 在 Controller 中,你可以直接使用
MultipartFile参数接收文件。
补充教学
1. 为什么 Bean 的名字一定要叫 multipartResolver?
这是 DispatcherServlet 的硬编码约定。它在初始化时会通过名称 MULTIPART_RESOLVER_BEAN_NAME(即 "multipartResolver")去查找。如果你的 Bean 叫别的名字,Spring 将无法自动检测到它。
2. CommonsMultipartResolver 的消亡
在旧版本的 Spring 中,大家经常使用基于 Apache Commons FileUpload 的 CommonsMultipartResolver。 现状:从 Spring Framework 6.0 开始,该类已被移除。现在唯一推荐的做法是使用 StandardServletMultipartResolver,它直接利用 Servlet 3.0+ 容器内置的解析能力。
3. Spring Boot 的便捷性
在 Spring Boot 中,你完全不需要手动定义 MultipartResolver Bean。
- Boot 自动配置了
StandardServletMultipartResolver。 - 你只需要在
application.properties中调整限制即可:propertiesspring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB