Spring 内置的 multipart 文件上传支持

Spring build-in multipart fileupload support

Spring 内置了对 web 应用 multipart(文件上传) 的支持,即通过可拔插的 MultipartResolver 对象实现对 multipart 的处理。该对象定义在 org.springframework.web.multipart 包内,它是按照 RFC 1867 设计的一个策略接口,自 Spring 2.5 开始,Sping 内包含了一个它的具体实现类,即 org.springframework.web.multipart.commons.CommonsMultipartResolver,该实现类是建立在 Jakarta Commons FileUpload 基础上的,因此在使用时需要引入对 ‘commons-fileupload.jar’ 的依赖。

默认情况下,Spring 是不对 multipart 进行处理的,你可以在你的 web 应用上下文配置中添加一个 MultipartResolver 的实现来启用对 multipart 的支持,这样容器就会对每个请求进行检查,如果发现请求包含了 multipart 数据,就会使用配置的 MultipartResolver 实现来对请求进行处理。

MultipartResolver 的用法

下面例子演示了如何使用 Sping 自带的实现类 CommonsMultipartResolver 来启用 multipart 处理,在 Spring 应用上下文中添加如下配置:

1
2
3
4
5
6
7
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available, the maximum file size in bytes, here is 100KB -->
<property name="maxUploadSize" value="100000"/>
</bean>

添加了该配置,当 Spring 的 DispatcherServlet 收到包含 multipart 的请求后,配置的 MultipartResolver 就会被调用来处理这类请求,它会将当前的 HttpServletRequest 包装成一个 MultipartHttpServletRequest 来支持 multipart 的处理。从 MultipartHttpServletRequest 中你可以获取到 multipart 的数据内容,从而让你的 Controller 能够直接访问请求中包含的文件。

处理表单上传文件请求示例

假设我们创建的表单页面如下:

1
2
3
4
5
6
7
8
9
10
<html>
<head><title>File Upload</title></head>
<body>
<form method="post" action="upload.do" enctype="multipart/form-data">
<input type="text" name="fileName" />
<input type="file" name="fileData" />
<input type="submit" />
</form>
</body>
</html>

我们给 form 标签添加了 enctype 属性,其值为 multipart/form-data,该属性是用来告知浏览器用什么方法对 multipart 字段内容进行编码。

阅读全文