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-Typemultipart/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.