Java:SpringMVC文件下载

SpringMVC的文件下载

定义:用户将服务器中文件下载到自己本地计算机中过程称之为文件下载

开发文件下载流程:

  1). 定位系统中哪些文件需要用户下载
  2). 将需要下载文件放入指定下载目录中
  3). 开发一个页面提供一个文件下载链接
  4). 开发下载Controller

1. SpringMVC框架部署

具体见Java: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);
}
  • 效果展示

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值