使用Response实现文件下载

第一步:建工程

并创建对应的包
在这里插入图片描述

第二步:改web.xml

<?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
     version="4.0"
     metadata-complete="true">
   
   </web-app>

把版本变为最新

第三步:创建servlet类

在这里插入图片描述

public class responseDown extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1:获取下载文件的路径
//      String realPath = this.getServletContext().getRealPath("/女神.jpg");
        String realPath = "E:\\IdeaProject\\ServletProject\\ServletStudy\\Response\\src\\main\\resources\\女神.jpg";
        System.out.println("下载文件的路径"+realPath);
        //2:下载的文件名 思路:获取/后面的那一段
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
        //3:设置让浏览器能够支持下载我们需要的东西
        //如果有中文文件名  需 URLEncoder.encode 编码否则有可能会乱码
//      resp.setHeader("Content-Disposition","attachment;filename="+fileName);
        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
        //4:获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        //5:创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //6:获取响应的OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
        //7:将FileOutputStream流写入到buffer缓冲区中,使用OutputStream将缓冲区中的数据输出到客户端
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        //8:关闭流对象
        in.close();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

第四步:在web.xml中注册此servlet

<!--注册Servlet-->
  <servlet>
    <servlet-name>down</servlet-name>
    <servlet-class>com.csnz.servlet.responseDown</servlet-class>
  </servlet>
<!--  配置servlet对应的映射-->
  <servlet-mapping>
    <servlet-name>down</servlet-name>
    <url-pattern>/down</url-pattern>
  </servlet-mapping>

第五步:在resources文件夹中添加要下载的文件

在这里插入图片描述

第六步:配置tomcat

在这里插入图片描述
在这里插入图片描述

第七步:启动服务器

女神照片下载成功!!!

接下来详解 responseDown中的具体实现下载的代码
在这里插入图片描述
这里无法直接使用/女神.jsp的方式来找到此文件
因为getServletContext是在当前目录下查找的
如果这样子运行 web端会出错404
在这里插入图片描述
思路:因为realPath是字符串 所以我们可以使用字符串的截取方式 获取/后面的内容
这里如果直接/肯定会出错 需要转义
在这里插入图片描述
这里setHeader()中的两个参数是固定写法
在这里插入图片描述
就是说in 能获取到指定下载文件的内容
在这里插入图片描述
这里建立缓冲区的目的是为了更快速 同时效率更高
在这里插入图片描述
out 的意思为 使用out输出数据
在这里插入图片描述
每次用in去读取缓冲区容量大小的文件内容,如果他大于0 则证明文件还未全部读取完

 out.write(buffer,0,len);

输出缓冲区中有效长度的内容

最后,关闭流对象
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值