Multipart Resolver

org.springframework.web.multipart 包中的 MultipartResolver 是一种策略,用于解析包括文件上传在内的多部分请求。有一个基于容器的 StandardServletMultipartResolver 实现,用于 Servlet 多部分请求解析。请注意,已经过时的 CommonsMultipartResolver(基于 Apache Commons FileUpload)不再可用了,自 Spring Framework 6.0 及其新的 Servlet 5.0+ 基线以来。 要启用多部分处理,你需要在 DispatcherServlet Spring 配置中声明一个 MultipartResolver Bean,其名称为 multipartResolverDispatcherServlet 会检测它并将其应用于传入的请求。当接收到内容类型为 multipart/form-data 的 POST 请求时,解析器解析内容,将当前的 HttpServletRequest 包装为 MultipartHttpServletRequest,除了将部分公开为请求参数,还提供对已解析文件的访问。

Servlet Multipart Parsing

需要通过 Servlet 容器配置来启用 Servlet 多部分解析。具体做法为:

  • 在 Java 中,在 Servlet 注册上设置 MultipartConfigElement

  • web.xml 中,向 servlet 声明添加一个 "<multipart-config>" 部分。

下面的示例展示了如何在 Servlet 注册中设置一个 MultipartConfigElement

  • Java

  • Kotlin

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	// ...

	@Override
	protected void customizeRegistration(ServletRegistration.Dynamic registration) {

		// Optionally also set maxFileSize, maxRequestSize, fileSizeThreshold
		registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
	}

}
class AppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {

	// ...

	override fun customizeRegistration(registration: ServletRegistration.Dynamic) {

		// Optionally also set maxFileSize, maxRequestSize, fileSizeThreshold
		registration.setMultipartConfig(MultipartConfigElement("/tmp"))
	}

}

一旦 Servlet 多部分配置就绪,你就可以添加一个名为 multipartResolver 且类型为 StandardServletMultipartResolver 的 Bean。

该解析器变体会按原样使用您的 Servlet 容器的多部件解析器,可能导致应用程序受到容器实现差异的影响。默认情况下,它将尝试使用任何 HTTP 方法解析任何 multipart/ 内容类型,但这在所有 Servlet 容器中可能不受支持。有关详细信息和配置选项,请参阅https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/support/StandardServletMultipartResolver.html[StandardServletMultipartResolver] javadoc。