文件上传客户端所需的三要素:
- 表单项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接口的实现类:
- CommonMutipartResolver:通过Jakarta Commons FileUpload解析multipart请求,需要导入相应的包;
- StandardServletMultipartResolver :依赖于Servlet 3.0对multipart请求的支持,不需要导包,但必须使用支持Servlet3.0的容器;
从Tomcat 7.0.x的版本开始就支持Servlet3.0了。
方式一:StandardServletMultipartResolver配置
- 配置multipartResolver的bean
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
- 配置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配置
- 导入这两个jar包
commons-fileupload-1.3.3.jar
commons-io-2.8.0.jar
- 配置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>