1.文件上传与文件下载的概念
文件下载:将文件从服务器下载到浏览器中
文件上传:将文件从浏览器上传到服务器中
本质:都是文件复制的过程
2.SpringMVC实现文件下载
1.需要使用ResponseEntity类,ResponseEntity类用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。
2.文件下载的步骤一般都是固定的,唯一不同的只是服务器中文件的下载路径,可以作为一个模板,以后只改该路径即可。
我的文件路径为:
@RequestMapping("/testDown")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws
IOException {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("/img/1.jpg");
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组
byte[] bytes = new byte[is.available()];
//将流读到字节数组中
is.read(bytes);
//创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
//设置要下载方式以及下载文件的名字
headers.add("Content-Disposition", "attachment;filename=1.jpg");
//设置响应状态码
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers,
statusCode);
//关闭输入流
is.close();
return responseEntity;
}
3.文件的真实路径若不知分隔符的情况下,可以使用File.separator来进行拼接,该方法能够自动匹配当前的系统需要的分隔符
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("img");
realPath = realPath + File.separator + "1.jpg";
3..SpringMVC实现文件上传
准备工作:导入依赖commons-fileupload
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
1.实现上传功能时必须要有表单,表单中要有文件域:type=file,且必须满足两个两个条件:
1)method必须为post
2)enctype,即浏览器向服务器传输请求参数的方式:文件上传时必须将参数设置为:multipart/form-data(以二进制的形式上传)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<form th:action="@{/test/up}" method="post" enctype="multipart/form-data">
头像:<input type="file" name="photo"><br/>
<input type="submit" value="上传">
</form>
</body>
2.实现文件上传功能时必须配置文件上传解析器;必须设置id为:multipartResolver;因为在自动装配时是根据id来匹配的,而不是根据类型匹配的
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
@RequestMapping("/test/up")
public String testUp(MultipartFile photo,HttpSession session) throws IOException {
//获取上传的文件的文件名
String fileName = photo.getOriginalFilename();
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取当前工程下photo目录的真实路径
String photoPath = servletContext.getRealPath("photo");
//创建photoPath所对应的File对象
File file = new File(photoPath);
//判断目录是否存在
if(!file.exists()){
file.mkdir();
}
String finalPath = photoPath + File.separator + fileName;
//上传文件
photo.transferTo(new File(finalPath));
return "success";
}
3.解决文件上传功能时文件重名的问题:
使用UUID作为文件名,保证文件名不会重复,从而解决重名问题。
/*
为解决上传文件的文件名重名的问题,将上传文件的文件名使用uuid与后缀进行拼接
*/
//获取上传的文件的文件名
String fileName = photo.getOriginalFilename();
//获取上传的文件的后缀名
String hzName = fileName.substring(fileName.lastIndexOf("."));
//获取uuid
String uuid = UUID.randomUUID().toString();
//拼接一个新的文件名
fileName = uuid + hzName;
注意:UUID 是 通用唯一识别码(Universally Unique Identifier)
4.效果展示:
上传后的文件位于: