• JavaServlet实现下载功能


        我们在项目中经常会用到下载功能,所以今天我们先说下下载功能实现的思路,然后通过一个案例代码来具体体现。

    1.下载的思路:

    ①首先要获取我们要操作的文件对象的路径

    ②然后使用获取的文件对象路径构建一个文件操作流对象

    ③设置好相关的http响应的头,告诉浏览器怎么来操作我们写回的数据,是下载、打开等等。

    ④通过response获取字节流,并结合我们的文件流进行读取和写出操作

    ⑤关闭相关的流资源

    2.下载具体servlet实现代码:

    package com.servlet;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/download.do")
    public class DownloadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /**
         * 使用servlet实现文件下载功能
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String fileName = "关系图.jpg";
            OutputStream out = null;
            FileInputStream fis = null;
            // 1.获取资源文件的路径,当文件名是中文的时候出现不正常的情况,所以需要进行url编码
            String path = this.getServletContext().getRealPath("/WEB-INF/classes/com/servlet/" + URLEncoder.encode(fileName, "UTF-8"));
            try {
                // 2.根据获取到的路径,构建文件流对象
                fis = new FileInputStream(path);
                out = response.getOutputStream();
                // 3.设置让浏览器不进行缓存,不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行,就是找不到文件
                response.setHeader("Pragma", "No-cache");
                response.setHeader("Cache-Control", "No-cache");
                response.setDateHeader("Expires", -1);
                // 4.设置Content-type字段
                response.setContentType("image/jpeg");
                // 5.设置http响应头,告诉浏览器以下载的方式处理我们的响应信息
                response.setHeader("content-disposition", "attachment;filename=" + fileName);
                // 6.开始写文件
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = fis.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
            } finally {
                if (fis != null) {
                    fis.close();
                }
    
            }
    
        }
    
    }

    至此一个简单的servlet实现下载功能已经实现完毕,有不足的地方,希望大家多多提意见!

  • 相关阅读:
    Redis学习——数据结构下
    CI 笔记7,easyui 异步加载
    CI 笔记,借鉴的4个辅助自定义函数
    CI笔记6 json 传值
    CI 笔记,使用 json的参考文档(废弃)
    CI 笔记5 (CI3.0 默认控制器,多目录)
    CI 笔记(easyui js命令)
    CI 笔记4 (easyui 手风琴)
    CI 笔记3 (easyui 的layout布局,最小化layout原型)
    CI 笔记3 (easyui 和 js 排错)
  • 原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7128001.html
Copyright © 2020-2023  润新知