Java Web 回顾总结(五) - HttpServlet - Response - 5.3.2 浏览器下载文件

本节只讨论 使用HttpServletResponse对象实现文件的下载

文件下载基本步骤:

  1.获取文件的绝对路径

  2.获取文件名

  3.设置content-disposition响应头控制浏览器 以下载的形式打开文件

  4.获取要下载的文件输入流

  5.创建数据缓冲区

  6.通过response对象获取OutputStream

  7.将 文件输入流 写入到 缓冲区

  8.使用 OutputStream缓冲区 的数据输出到浏览器


用OutputStream输出文件

代码示例
        //获取项目所在文件位置
        String path = this.getClass().getClassLoader().getResource("/").getPath()+"//img//路线.png";

//      // 查看路径是否正确
//      System.out.println(path);
        // 获取要下载的文件名 ,需要向后移动一位 ,有 `/`
        String filename = path.substring(path.lastIndexOf("//")+1);
        // 设置响应头 content-disposition  ,并对文件名编码
        response.setHeader("content-disposition", "attachment;filename="+filename);
        // 获取 文件的 输入流
        InputStream inputStream = new FileInputStream(path);
        // 创建 数据(byte) 缓冲区
        byte[] buffer = new byte[1024];

        // 获取 OutputStream 流
        OutputStream outputStream = response.getOutputStream();

        // 将 inputStream 写入到 buffer 中
        while(true) {
            // 从 inputStream 中读取最多 1024 个字节(1k) 到 buffer中 ,一次最多读取 1k
            // 返回读取的长度
            int len = inputStream.read(buffer);
            // 判断是否读完
            if(len == -1) {
                // 关闭 文件流
                inputStream.close();
                // 跳出
                break;
            }

            //每次往 outputStream 后 添加 从 buffer[0]开始到 buffer[len-1]个字节
            //总共 len 个字节
            outputStream.write(buffer,0, len);

        }
        // 结束本次输出
        outputStream.flush();

用PrintWriter输出文件

代码示例
public void init(ServletConfig config) throws ServletException {
        // this.getServletContext().getRealPath("/") 获取项目绝对路径
        // 获取 要下载文件 绝对地址
        this.path = this.getServletContext().getRealPath("/")+"//img//路线.png" ;
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        // TODO Auto-generated method stub
        String filename = path.substring(path.lastIndexOf("//")+1);
        // 设置响应头 为文件下载
        response.setHeader("content-disposition", "attachment;filename="+filename);
        // 获取PrintWriter
        PrintWriter pWriter = response.getWriter();
        // 获取 FileReader ,并读取文件
        FileReader fileReader = new FileReader(path);

        // 设置字符 输出 每次2个字节 ,可能有转不过的字符
        char[] buffer = new char[1024];

        while(true) {
            // 读取文件
            int len = fileReader.read(buffer);
            if(len == -1) {
                // 读取文件到末尾
                fileReader.close();
                break;
            }
            // 写出到返回文件中
            pWriter.write(buffer, 0 , len);
        }

        // 结束写出 
        pWriter.flush();
    }

注意

使用PrintWriter处理 字节数据,会导致数据丢失

尽可能的使用 OutputStream 来处理文件

因此在编写文件 处理功能时,要使用OutputStream流(字节流),可以处理任意类型的数据
避免使用PrintWriter流(字符流),只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值