Spring MVC文件上传与多文件上传

文件上传客户端所需的三要素:

  • 表单项type=“file”
  • 表单的提交方式是post
  • 表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”

这里的“multipart/form-data”属性值表示该表单使用multipart请求提交

一、multipart请求

传统的表单提交enctype使用的是默认的属性值“application/x-www-form-urlencoded”,表单的正文内容格式是:key=value&key=value&key=value,一般用于文本类型数据的提交,但对于提交文件、图片、视频等二进制文件,就需要使用multipart请求提交,multipart请求是通过post方法实现的,所以表单的提交方式必须设置为post

multipart格式的数据会将表单分割为块,每个字段对应一块,每块都有自己的数据类型,上传文件对应的块的数据类型就可以是二进制了
在这里插入图片描述
因为multipart请求的数据是通过二进制传输的,所以request无法获取到值,需要解析multipart请求

二、配置multipart解析器

DispatchServlet并不负责解析mutipart 请求,而是调用一个实现了MultipartResolver接口的类来解析mutipart请求,从Spring3.1开始,Spring就提供了两个实现了MultipartResolver接口的实现类:

  1. CommonMutipartResolver:通过Jakarta Commons FileUpload解析multipart请求,需要导入相应的包;
  2. StandardServletMultipartResolver :依赖于Servlet 3.0对multipart请求的支持,不需要导包,但必须使用支持Servlet3.0的容器;

从Tomcat 7.0.x的版本开始就支持Servlet3.0了。

方式一:StandardServletMultipartResolver配置

  1. 配置multipartResolver的bean
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
  1. 配置web.xml
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
    	<!-- 临时文件的目录 -->
        <location>E:\</location>
        <!-- 上传文件最大2M -->
        <max-file-size>2097152</max-file-size>
        <!-- 上传文件整个请求不超过4M -->
        <max-request-size>4194304</max-request-size>
    </multipart-config>
</servlet>

方式二: CommonMutipartResolver配置

  1. 导入这两个jar包

commons-fileupload-1.3.3.jar
commons-io-2.8.0.jar

  1. 配置multipartResolver的bean
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 上传文件总大小 -->
  	<property name="maxUploadSize" value="5242800"/>
  	<!-- 上传文件的阈值 -->
  	<property name="maxInMemorySize" value="100000" />
 	 <!-- 上传文件的编码类型 -->
 	<property name="defaultEncoding" value="UTF-8"/>
</bean>

两种方式bean的id名必须设为multipartResolver,DispatcherServlet默认会从Spring的上下文中获取id为multipartResolver的bean作为它的MutipartResolver

三、编写文件上传代码

@RequestMapping(value="/fileUpload")
@ResponseBody //告知SpringMVC框架,不进行视图跳转,直接进行数据响应
public void one16(@RequestParam("name") String name,@RequestParam("file") MultipartFile file){
    public void quickMethod20(String name,MultipartFile uploadFile) throws IOException {
        //获得文件名称
        String originalFilename = uploadFile.getOriginalFilename();
        //保存文件
        uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));
    }
}

这里使用MultipartFile类接收传入的文件

客户端代码

<form action="${pageContext.request.contextPath }/oc/fileUpload" method="post" enctype="multipart/form-data">
    名称:<input type="text" name="name"/><br/>
    文件:<input type="file" name="file"/><br/>
    <input type="submit" value="上传"/>
</form>

四、MultipartFile

MultipartFile是org.springframework.web.mutipart包下的一个接口

  • 一种可以接收使用多种请求方式来上传文件的表示形式
  • 接收的文件内容可以存储到内存中或存储在磁盘的临时文件上
  • 可以自由的拷贝文件到session中
  • 临时性的存储会在请求结束后被清除掉

所以使用MultipartFile来完成基于spring框架实现文件上传的功能可能是最合适的选择。

方法:

getOriginalFileName()方法可以获取文件的完整名称,包括文件名称+文件拓展名。
transferTo()方法用来将接收文件传输到给定目标路径,会抛出IOException、IllegalStateException异常。

五、多文件上传

我们在使用MultipartFile作为参数传递的时候,可以将MultipartFile声明为一个数组,这样就能支持多文件传输

@RequestMapping(value="/fileUpload")
@ResponseBody //告知SpringMVC框架,不进行视图跳转,直接进行数据响应
public void one16(String name,MultipartFile file){
    public void quickMethod20(@RequestParam("name") String name,@RequestParam("file") MultipartFile[] uploadFile) throws IOException {
    	for (MultipartFile multipartFile : file) {
        	//获得文件名称
        	String originalFilename = uploadFile.getOriginalFilename();
        	//保存文件
        	uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));
        }
    }
}

客户端代码

只需要将页面修改为多个文件上传项

<form action="${pageContext.request.contextPath }/oc/fileUpload" method="post" enctype="multipart/form-data">
    名称:<input type="text" name="name"/><br/>
    文件:<input type="file" name="file"/><br/>
    文件:<input type="file" name="file"/><br/>
    <input type="submit" value="上传"/>
</form>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值