《Spring实战》读书笔记--SpringMVC处理Multipart数据

Multipart介绍

Multipart形式的数据

Multipart格式数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它对应的部分会放置文本型数据,如果是文件上传形式,它对应的部分可以是二进制。

Multipart/form-data请求方式

Multipart/form-data是建立在HTTP的POST请求方式以上的请求,其一般用于HTTP文件上传。
所以我们需要在表单(form)元素中如下设置,使得该表单请求用于处理文件:

1
<form class="" action="" method="post" enctype="multipart/form-data">

SpringMVC处理Multipart数据

Spring配置Multipart解析器

DispatcherServlet没有实现解析multipart请求数据的功能。它将任务委托给Spring中MutipartResolver策略接口实现,通过这个实现类来解析multipart请求中的内容。Spring3.1后内置两个MultipartResolver的实现供我们选择:

  • CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart请求。
  • StandardServletMultipartResolver: 依赖于Servlet3.0对multipart请求的支持。

使用CommonsMultipartResolver解析器

因为CommonsMultipartResolver依赖于Apache Commons FileUpload,所以我们需要引入commons-fileupload。

1
2
3
4
5
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

在SpringMVC配置文件中装载Bean即可,通过注入相关属性设置参数。

1
2
3
4
5
6
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="1024000" />
<property name="maxInMemorySize" value="204800" />
<property name="uploadTempDir" value="/" />
</bean>

相关属性说明

属性名 说明
defaultEncoding 默认的解析编码,默认为iso-8859-1
maxUploaadSize 上传文件的最大大小,默认为-1(无限制)
maxInMemorySize 内存缓冲区大小,超过时写入硬盘,默认为-1(无限制)
uploadTempDir 临时文件目录,默认是serlvet容器的临时目录

使用StandardServletMultipartResolver解析器

在SpringMVC配置文件中装载Bean

1
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">

因为StandardServletMultipartResolver解析使用Servlet的处理Multipart方法处理,所以我们需要在web.xml中设置DispatcherServlet时设置相关属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<servlet>
<servlet-name>useSpringMVC-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<location>/</location>
<max-file-size>102400</max-file-size>
<max-request-size>204800</max-request-size>
</multipart-config>
</servlet>

相关属性说明

属性名 说明
location 上传文件所存放的临时目录。必须指定
max-file-size 文件的最大大小,单位为字节。默认没有限制
max-request-size 请求的最大大小,单位为字节。默认没有限制)
file-size-threshold 文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。默认值为0

处理multipart请求

Spring提供了MutilpartFile接口处理Mutilpart数据。接口API如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface MultipartFile {
/**
* 返回表单中mutilpart数据的名字
*/
String getName();
/**
* 返回该文件名
*/
String getOriginalFilename();
boolean isEmpty();
byte[] getBytes() throws IOException;
InputStream getInputStream() throws IOException;
/**
* 把MultipartFile接口对象转换为File对象
*/
void transferTo(File dest) throws IOException, IllegalStateException;
}

Reference

https://my.oschina.net/cnlw/blog/168466