SpringMVC处理multipart请求的示例代码

时间:2022-09-13 21:48:27

一、简述

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

SpringMVC处理multipart请求的示例代码

二、 配置 multipart 解析器

尽管multipart请求看起来很复杂,但在spring mvc中处理它们却很容易。在编写控制器方法处理文件上传之前,我们必须要配置一个multipart解析器,通过它来告诉dispatcherservlet该如何读取multipart请求。

spring 内置了两个multipartresolver的实现:

  1. commonsmultipartresolver :使用jakarta commons fileupload解析multipart请求;

  2. standardservletmultipartresolver :依赖于servlet 3.0对multipart请求的支持(始于spring 3.1)。

standardservletmultipartresolver的配置:

1、声明bean:

在applicationcontext.xml 配置

 

复制代码 代码如下:
<bean id="multipartresolver" class="org.springframework.web.multipart.support.standardservletmultipartresolver>

 

 

在配置类中配置

?
1
2
3
4
@bean(name = "multipartresolver")
public standardservletmultipartresolver getstandardservletmultipartresolver(){
    return new standardservletmultipartresolver();
}

tips:multipart解析器的命名一定要是 multipartresolver ,否则会报错。

2、配置上传参数:

* web.xml 配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<servlet>
 <servlet-name>dispatcherservlet</servlet-name>
 <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
 <init-param>
   <param-name>contextconfiglocation</param-name>
   <param-value>classpath:applicationcontext.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
 <multipart-config>
   <!--上传到/tmp/upload 目录-->
  <location>/tmp/upload</location>
   <!--文件大小为2m-->
  <max-file-size>2097152</max-file-size>
   <!--整个请求不超过4m-->
  <max-request-size>4194304</max-request-size>
   <!--所有文件都要写入磁盘-->
  <file-size-threshold>0</file-size-threshold>
 </multipart-config>
</servlet>
<servlet-mapping>
 <servlet-name>dispatcherservlet</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

* 配置类中配置

继承 abstractannotationconfigdispatcherservletinitializer 的配置类

?
1
2
3
4
5
@override
protected void customizeregistration(servletregistration.dynamic registration) {
  //上传到/tmp/upload 目录,文件大小为2m,整个请求不超过4m,而且所有文件都要写入磁盘
  registration.setmultipartconfig(new multipartconfigelement("e:\\upload_ftp",2097152,4194304,0));
}

commonsmultipartresolver的配置:

1、声明bean 和 配置上传参数

?
1
2
3
4
5
6
<bean id="multipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresolver">
  <!--设置上传目录/tmp/upload;最大的文件容量设置为2m;最大的内存大小设置为0,表示所有文件都会写入磁盘中;无法设定multipart请求整体的最大容量-->
  <property name="uploadtempdir" value="/tmp/upload"/>
  <property name="maxuploadsize" value="2097152"/>
  <property name="maxinmemorysize" value="0"/>
</bean>

区别:

1、 commonsmultipartresolver 相比较 standardservletmultipartresolver 来说 就是无法设定multipart请求整体的最大容量。

2、 commonsmultipartresolver 不会强制要求设置临时文件路径。默认情况下,这个路径就是 servlet 容器的临时目录。 standardservletmultipartresolver 必须设置临时文件路径才能正常执行。(以上所述上传目录均为临时文件路径)

三、springmvc 处理请求

1、前端form 表单

?
1
2
3
4
<form action="/picture" method="post" enctype="multipart/form-data">
  <input type="file" name="picture">
  <input type="submit">
</form>

tips:需要设置   enctype="multipart/form-data",以告诉springmvc 这是一个multipart 请求。

2、后端mvc接受请求

?
1
2
3
4
5
6
7
8
@requestmapping(value = "/picture",method = requestmethod.post)
public string gethome(@requestpart("picture") multipartfile picture) throws ioexception {
  string name = picture.getname();
  byte[] bytes = picture.getbytes();
  picture.transferto(new file("/"+picture.getoriginalfilename()));
  //这里保存到文件系统的时候要用相对路径,比如这里配置的是 /。以配置的上传目录为基准。即文件路径 e:/upload_ftp/ 是保存的目录
  return "home";
}

tips:1、@requestpart("picture") : 当注册表单提交的时候,p icture 属性将会给定一个 byte 数组,这个数组中包含了请求中对应 part 的数据(通过 @requestpart 指定)。如果用户提交表单的时候没有选择文件,那么这个数组会是空(而不是 null )。所以说我们甚至可以用byte[]数组接收multipart请求而不用  multipartfile。

2、multipartfile :用multipartfile方法接收为我们提供了很多的方法以便进行接下来的工作...

SpringMVC处理multipart请求的示例代码

3、 以 part的形式接受上传的文件

就主体来言, part 接口与 multipartfile 并没有太大的差别。  在很多情况下, part 方法的名称与 multipartfile 方法的名称是完全相同的。有一些比较类似,但是稍有差异,比如 getsubmittedfilename() 对应于 getoriginalfilename() 。类似地, write() 对应于 transferto() ,借助该方法我们能够将上传的文件写入文件系统中。

值得一提的是,如果在编写控制器方法的时候,通过part参数的形式接受文件上传,那么就没有必要设置multipartresolver 了。只有使用multipartfile的时候,我们才需要multipartresolver。

?
1
2
3
4
5
@requestmapping(value = "/picture",method = requestmethod.post)
public string gethome(@requestpart("picture") part picture) throws ioexception {
  picture.write("/"+picture.getsubmittedfilename());
  return "home";
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/jmcui/p/8179174.html