Multipart Resolver

来自 org.springframework.web.multipart包的 MultipartResolver 是一个解析多部件请求的策略,包括 文件上传。有一个基于 Commons FileUpload 的实现,另一个基于 Servlet 3.0 的多部件请求解析。

为了启用多部件处理,你需要在 DispatcherServlet 的 Spring 配置中声明一个 MultipartResolver bean,名称为 multipartResolver。DispatcherServlet 会检测到它并将其应用于传入的请求。当收到一个内容类型为 multipart/form-data的 POST 时,解析器会将内容包裹在当前的 HttpServletRequest 中,作为一个 MultipartHttpServletRequest 来提供对解析文件的访问,此外还将部分内容作为请求参数公开。

Apache Commons FileUpload

为了使用 Apache Commons FileUpload,你可以配置一个 CommonsMultipartResolver 类型的 Bean,名字是 multipartResolver。你还需要将commons-fileupload jar 作为你 classpath 上的一个依赖项。

这个解析器变体委托给应用程序中的一个本地库,提供跨 Servlet 容器的最大可移植性。作为替代方案,可以考虑通过容器自己的解析器进行标准的 Servlet 多部件解析,如下文所述。

:::info Commons FileUpload 传统上只适用于 POST 请求,但接受任何 multipart/内容类型。详情和配置选项见 CommonsMultipartResolver javadoc。 :::

Servlet 3.0

Servlet 3.0 的多部件解析需要通过 Servlet 容器配置启用。要做到这一点:

  • 在 Java 中,在 Servlet 注册中设置一个 MultipartConfigElement。
  • 在 web.xml 中,在 Servlet 声明中添加一个 <multipart-config>部分。

下面的例子显示了如何在 Servlet 注册中设置 MultipartConfigElement:

  1. public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  2. // ...
  3. @Override
  4. protected void customizeRegistration(ServletRegistration.Dynamic registration) {
  5. // 也可以设置 maxFileSize, maxRequestSize, fileSizeThreshold 参数
  6. registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
  7. }
  8. }

一旦 Servlet 3.0 配置到位,你就可以添加一个 StandardServletMultipartResolver类型的 Bean,其名称为 multipartResolver。

:::info 这个解析器变体按原样使用你的 Servlet 容器的多部件解析器,可能会使应用程序暴露在容器实现的差异中。默认情况下,它将尝试用任何 HTTP 方法解析任何 multipart/内容类型,但这可能不被所有 Servlet 容器所支持。有关详细信息和配置选项,请参见StandardServletMultipartResolver javadoc。 :::