文件上传概述
大多数文件上传都是通过表单形式提交给服务器后台的。当一个表单需要完成上传业务,需要设置如下几项属性。
- method属性必须为post。即只有post请求,后台才能接受。
- enctype属性必须为multipart/form-data
- 文件域的multiple属性设置为multiple则表示多文件上传,默认,单文件上传。
<form action="uploadUrl" method="post" enctype="multipart/form-data">
<input type="file" name="filename" multipe="multipe" />
<input type="submit" value="文件上传"/>
</form>
文件上传所需JAR包、对象
下载地址:https://archive.apache.org/dist/commons/
- commons-fileupload-1.3.2.jar
- commons-io-2.5.jar
当form表单的enctype属性为multipart/form-data时,浏览器会采用二进制的方式来处理表单数据。随之,Spring MVC由MultipartResolver(多部件解析器)对象提供支持。MultipartResolver是一个接口,需要通过它的实现类CommonsMultipartResolver类完成文件上传工作。
- 配置MultipartResolver接口的Bean
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件最大长度(字节)-->
<property name="maxUploadSize" value="xxx"/>
<!--缓存中最大尺寸-->
<property name="maxInMemorySize" value="xxx"/>
<!--编码格式-->
<property name="defaultEncoding" value="UTF-8"/>
<!--推迟文件解析-->
<property name="resolverLazily" value="xxx"/>
</bean>
CommonsMultipartResolver内部引用"multipartResolver"字符串获取该实现类并完成文件解析的,Bean的id必须为multipartResolver
2. 控制类,处理请求方法
@Controller
public class FileUploadController{
@RequestMapping("/fileUpload")
public String handleFormUpload(@RequestParam("name") String name,@RequestParam("filename") MultipartFile file,...){
if(!file.isEmpty()){
//文件存储
....
....
//返回文件上传成功视图
return "uploadSuccess";
}
//返回文件上传失败视图
return "uploadFailure";
}
}
MultipartFile接口
上传的文件就是被封装在MultipartFile接口中。如下是一些常用方法:
方法 | 说明 |
---|---|
byte[] getBytes() | 以字节形式返回文件的内容 |
String getCntentType() | 获取文件的内容类型 |
InputStream getInputStream() | 读取文件内容,返回一个InputStream流 |
String getName() | 获取表单form的参数名称 |
String getOriginalFilename() | 获取上传文件的初始化名 |
long getSize() | 获取上传文件的大小,单位字节 |
boolean isEmpty() | 上传文件是否为空 |
void transferTo(File file) | 将上传文件保存到指定目录下 |
应用案例——文件上传
- 创建项目chapter16,创建相应的包
- 导入JAR包
- 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLoaction</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<display-name>chapter16</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 配置springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 扫描所需要的包 -->
<context:component-scan base-package="com.syl.controller"/>
<!-- 配置注解驱动 -->
<mvc:annotation-driven />
<!-- 定义视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
<!-- 文件上传解析器MultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 请求编码格式 -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
</beans>
- 上传界面
- 控制层,创建处理请求方法
@Controller
public class FileUploadController {
/**
* 文件上传
*/
@RequestMapping("/fileUpload")
public String handleFormUpload(@RequestParam("name") String name,
@RequestParam("uploadfile") List<MultipartFile> uploadfile,
HttpServletRequest request) {
//判断上传文件是否存在
if(!uploadfile.isEmpty() && uploadfile.size() > 0) {
//循环输出上传的文件
for(MultipartFile file : uploadfile) {
//获取上传文件的原始名称
String originalFilename = file.getOriginalFilename();
//设置上传文件保存目录
String dirPath = request.getServletContext().getRealPath("/upload/");
File filePath = new File(dirPath);
//如果保存路径不存在,则创建目录
if(!filePath.exists()) {
filePath.mkdir();
}
//使用UUID重新命名上传的文件名称,以防文件名相同,覆盖原文件
String newFilename = name +"_"+UUID.randomUUID()+"_"+originalFilename;
try {
//将文件上传指定目录
file.transferTo(new File(dirPath+newFilename));
}catch(Exception e) {
e.printStackTrace();
return "error";
}
}
//跳转到文件上传成功页面
return "success";
}else {
return "error";
}
}
}
- view
文件下载概述
Spring MVC提供了一个ResponseEntity类型的对象,使用它可以很方便的定义返回的HttpHeaders对象和HttpStatus对象。 通过对这两个对象的设置,即可完成下载文件时所需的配置信息。
应用案例——文件下载
- 创建文件下载页面
- 控制层,处理请求方法
/*
* 文件下载请求
*/
@RequestMapping("/download")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
String filename)throws Exception{
//指定下载的文件路径
String path = request.getServletContext().getRealPath("/upload/");
//创建该文件对象
File file = new File(path+File.separator+filename);
//设置响应头
HttpHeaders headers = new HttpHeaders();
//通知浏览器以下载方式打开文件
headers.setContentDispositionFormData("attachment", filename);
//定义以流的形式下载返回文件
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用ResponseEntity对象封装返回下载数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
}
- view
@Syl 2021/08/29 20:51 结尾前两天留