来自 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:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
// ...
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
// 也可以设置 maxFileSize, maxRequestSize, fileSizeThreshold 参数
registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
}
}
一旦 Servlet 3.0 配置到位,你就可以添加一个 StandardServletMultipartResolver
类型的 Bean,其名称为 multipartResolver。
:::info
这个解析器变体按原样使用你的 Servlet 容器的多部件解析器,可能会使应用程序暴露在容器实现的差异中。默认情况下,它将尝试用任何 HTTP 方法解析任何 multipart/
内容类型,但这可能不被所有 Servlet 容器所支持。有关详细信息和配置选项,请参见StandardServletMultipartResolver javadoc。
:::