文章目录
SpringMVC的文件下载
定义:用户
将服务器中文件下载到自己本地计算机
中过程称之为文件下载开发文件下载流程:
1). 定位系统中哪些文件需要用户下载 2). 将需要下载文件放入指定下载目录中 3). 开发一个页面提供一个文件下载链接 4). 开发下载Controller
1. SpringMVC框架部署
2. 准备工作
案例:图片的文件下载
2.1 新增list页面
在文件上传基础上新增list页面
文件上传具体步骤见 Java:SpringMVC的文件上传
在
webapp
下创建list.jsp
- list.jsp
2.2 修改index页面
- index.jsp
<table width="100%" height="700">
<tr>
<td width="200" style="border-right: red 2px solid;background-color: greenyellow">
<ul>
<li><a href="bookAdd.jsp" target="mainFrame">添加图书</a></li>
<li><a href="list.jsp" target="mainFrame">图片列表</a> </li>
</ul>
</td>
<td>
<iframe name="mainFrame" width="100%" height="700" frameborder="0" style="background-color: deepskyblue"></iframe>
</td>
</tr>
</table>
3. 文件列表功能实现
3.1 列表页面发起Ajax请求
在list.jsp发送Ajax请求,将显示响应在控制台,
测试ajax是否提交成功
- list.jsp
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$.get("book/list",function (res) {
console.log(res)
},"json");
</script>
3.2 控制器响应Ajax请求
控制器
新增listImg
方法,用来接收并响应Ajax请求
- BookController
@RequestMapping("/list")
@ResponseBody
public String[] listImg(HttpServletRequest request){
System.out.println("-----book.list-----");
//1.获取服务器上imgs目录路径
String imgsPath = request.getServletContext().getRealPath("imgs");
//2.获取图片信息
//根据imgs路径创建文件对象
File imgDir = new File(imgsPath);
//获取文件对象中所有文件名
String[] imgNames = imgDir.list();
return imgNames;
}
- 测试结果:Ajax提交并响应成功
3.3 列表图片展示
在list.jsp
使用Bootstrap框架
展示图片信息
1.引用Bootstrap的CSS和JavaScript文件的
CDN支持
2.使用Bootstrap提供的
缩略图组件
- 引用CDN支持
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
- 使用缩略图组件
组件地址:https://v3.bootcss.com/components/#thumbnails
代码如下:
<div class="row" id="container"></div>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$.get("book/list",function (res) {
for (var i = 0; i < res.length; i++) {
var fn = res[i];
var str = "<div class='col-lg-2 col-sm-6 col-md-4 col-xs-6'><div class='thumbnail'><img src='imgs/"+ fn +"' alt='...'>" +
"<div class='caption'><p><a href='#' class='btn btn-primary' role='button'>下载</a> " +
"<a href='#' class='btn btn-default' role='button'>查看</a></p></div></div></div>";
$("#container").append(str);
}
},"json");
</script>
- 展示结果
4. 文件下载功能实现
文件下载有两种形式,一种是直接在
页面打开
,一种是以附件形式下载
- 当
在线打开无法打开时,会自动进行附件下载
4.1 下载介绍
响应头:
content-disposition
有两个属性
inline 文件在线打开(默认)
attachment 文件附件下载
附件下载 attachment 附件 inline 在线打开(默认值)
response.setHeader("content-disposition", "inline;fileName=" + fileName);//设置文件在线打开
response.setHeader("content-disposition", "attachment;fileName=" + fileName);//设置文件附件下载
设置文件下载为在线打开的形式时,如果是浏览器可以打开的类型,比如 txt、png等类型,会直接打开,但是如果是exe等浏览器不能打开的类型时,它会尝试去用自己可以打开的类型(txt、png等)去打开,但是如果还是打不开,它就会以附件下载的形式下载下来。
4.2 列表页面下载按钮链接
- list.jsp
<h3>图片列表</h3>
<div class="row" id="container"></div>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$.get("book/list",function (res) {
for (var i = 0; i < res.length; i++) {
var fn = res[i];
var str = "<div class='col-lg-3 col-sm-6 col-md-4 col-xs-6'><div class='thumbnail'><img src='imgs/"+ fn +"' alt='...'>" +
"<div class='caption'><p><a href='book/downloadInline?fileName="+ fn +"' class='btn btn-primary' role='button'>在线打开</a> " +
"<a href='book/downloadAttachment?fileName="+ fn +"' class='btn btn-default' role='button'>附件下载</a></p></div></div></div>";
$("#container").append(str);
}
},"json");
</script>
4.3 控制器下载功能
4.3.1 在线打开形式
content-disposition
属性设置为inline
- BookController
@RequestMapping("downloadInline")
public void downloadImgInline(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
//1.获取下载资源路径
String dir = request.getServletContext().getRealPath("imgs");
String filePath = dir + "/" + fileName;
//2.通过文件输入流读取文件
FileInputStream inputStream = new FileInputStream(filePath);
//3.获取响应输出流
//response.setContentType("text/plain;charset=UTF-8");
response.setHeader("content-disposition", "inline;fileName=" + fileName);//设置文件在线打开
ServletOutputStream outputStream = response.getOutputStream();
// 5. 处理下载流复制
// 操作io流用IOUtils 操作file用FileUtils
// 通过工具类处理下载里复制和关闭流
IOUtils.copy(inputStream,outputStream);
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
}
- 效果展示
4.3.2 附件下载形式
content-disposition
属性设置为attachment
- BookController
@RequestMapping("downloadAttachment")
public void downloadImgAttachment(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException{
//1.获取下载资源路径
String dir = request.getServletContext().getRealPath("imgs");
String filePath = dir + "/" + fileName;
//2.通过文件输入流读取文件
FileInputStream inputStream = new FileInputStream(filePath);
//3.获取响应输出流
response.setContentType("text/plain;charset=UTF-8");
response.setHeader("content-disposition", "attachment;fileName=" + fileName);//设置文件附件下载
ServletOutputStream outputStream = response.getOutputStream();
// 5. 处理下载流复制
// 操作io流用IOUtils 操作file用FileUtils
// 通过工具类处理下载里复制和关闭流
IOUtils.copy(inputStream,outputStream);
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
}
- 效果展示