一般的提交简单的文本格式的数据,基于文本的表单提交可以满足要求,但是对于传输视频和照片二进制文件,就不行了。
multipart可以将表单拆分成多个部分,在一般表单输入域中,它会是基于文本型的数据。如果是上传文件可以对应为二进制。
Multipart/form-data是建立在HTTP的POST请求方式以上的请求,其一般用于HTTP文件上传。
所以我们需要在表单(form)元素中如下设置,使得该表单请求用于处理文件:
<form class="" action="" method="post" enctype="multipart/form-data">
SpringMVC处理Multipart数据
- 配置Multipart解析器
配值Multipart有两种方式CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart请求。StandardServletMultipartResolver: 依赖于Servlet3.0对multipart请求的支持。
- 方式一:
使用CommonsMultipartResolver解析器
因为CommonsMultipartResolver依赖于Apache Commons FileUpload,所以我们需要引入commons-fileupload
1 <dependency>
2 <groupId>commons-fileupload</groupId>
3 <artifactId>commons-fileupload</artifactId>
4 <version>1.3.1</version>
5 </dependency>
在SpringMVC配置文件中装载Bean即可,通过注入相关属性设置参数。
<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>
- 方式二:
使用StandardServletMultipartResolver解析器,在SpringMVC配置文件中装载Bean
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
因为StandardServletMultipartResolver解析使用Servlet的处理Multipart方法处理,所以我们需要在web.xml中设置DispatcherServlet时设置相关属性
<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>
- 处理Multipart请求
Spring提供了MutilpartFile接口处理Mutilpart数据。接口API如下:
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;
}
controller代码
@RequestMapping(value="/upload", method=RequestMethod.POST)
public String fileUpload(@RequestPart(value="file") MultipartFile multipartFile){
//处理逻辑
String path = "/usr/java/fileupload/" + file.getOriginalFilename();
multipartFile.transferTo(new File(path));
}
多文件上传
多文件上传只需要把html代码中的< input name=".." >name属性设置为一样的就好。然后在controller中使用MultipartFile数组接受就行。
1 @RequestMapping(value="/upload", method=RequestMethod.POST)
2 public String fileUpload(@RequestPart(value="file") MultipartFile[] multipartFiles){
3 //处理逻辑
4 }
网友评论