Skip to content

多部分请求解析器 (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 请求时,它会:

  1. 调用 multipartResolver 解析请求。
  2. 将原始请求包装为 MultipartHttpServletRequest。
  3. 在 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 中调整限制即可:
    properties
    spring.servlet.multipart.max-file-size=10MB
    spring.servlet.multipart.max-request-size=10MB

Based on Spring Framework.