文章目录
零、学习目标
- 掌握利用Spring Boot实现文件下载功能
一、文件下载概述
下载文件能够通过IO流实现,所以多数框架并没有对文件下载进行封装处理。文件下载时涉及到不同浏览器的解析处理,可能会出现中文乱码的情况,因此需要设法解决中文乱码问题。
二、实现文件下载功能
(一)创建Spring Boot项目
- 创建FileDownloadDemo项目,添加Web、Thymeleaf依赖
- 在pom.xml里引入文件下载的一个工具类依赖commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
(二)整合Bootstrap
- 将第14讲项目FileUploadDemo的resources/static里的bootstrap-4.0.0拷贝到当前项目相应位置
(三)准备待下载文件
- 在D盘创建下载目录,存放待下载文件
- 一个是纯英文文件名,一个是中英文文件名
(四)编写文件下载页面
- 在templates目录里创建文件下载页面 - filedownload.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,shrink-to-fit=no">
<link th:href="@{/bootstrap-4.0.0/css/bootstrap}" rel="stylesheet">
<script th:src="@{/bootstrap-4.0.0/js/jquery-3.4.1.js}"></script>
<script th:src="@{/bootstrap-4.0.0/js/bootstrap.bundle.js}"></script>
<script th:src="@{/bootstrap-4.0.0/js/bootstrap.js}"></script>
<title>文件下载</title>
</head>
<body>
<div class="w-50 m-auto bg-info">
<h3 class="h3">文件下载</h3>
<label>Spring Boot.txt</label>
<a th:href="@{/downloadFile(filename='Spring Boot.txt')}">下载</a><br/>
<label>Spring Boot开发基础.txt</label>
<a th:href="@{/downloadFile(filename='Spring Boot开发基础.txt')}">下载</a>
</div>
</body>
</html>
(五)编写文件下载控制器
package net.hw.lesson15.controller;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
/**
* 功能:文件下载控制器
* 作者:华卫
* 日期:2021年03月01日
*/
@Controller
public class FileDownloadController {
@RequestMapping("/toFileDownload")
public String toDownload(HttpServletRequest request) {
return "filedownload";
}
@RequestMapping("/downloadFile")
public ResponseEntity<byte[]> downloadFile(String filename) {
// 定义下载文件所在的位置
String dir="D:/download";
File file = new File(dir + File.separator + filename);
// 设置响应头
HttpHeaders httpHeaders = new HttpHeaders();
// 让浏览器以附件,即下载的方式打开
httpHeaders.setContentDispositionFormData("attachment", filename);
// 定义以流的形式返回数据
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
try {
return new ResponseEntity<>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
// 重新实例化headers,否则前台不会显示出错信息
httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<>(e.getMessage().getBytes(), httpHeaders, HttpStatus.EXPECTATION_FAILED);
}
}
}
(六)启动应用,测试效果
- 访问
http://localhost:8080/toFileDownload
- 查看下载的文件
- 大家可以看到,下载纯英文文件名的文件,一切正常,但是文件名包含中文,下载后的文件名就会出现乱码问题。
- 删除下载目录里的Spring Boot.txt,再次下载该文件,查看结果,页面显示错误信息
三、解决中文名文件乱码问题
(一)在文件下载控制器里编写获取文件名方法
(二)修改文件下载控制器里的downloadFile方法
(三)启动应用,测试效果
- 可以看到,下载中文文件名也不会出现乱码了。
四、课后拓展练习
- 修改代码,下载其他类型的文件并测试。