zoukankan      html  css  js  c++  java
  • jsp+servlet实现文件下载

    下载

    1. 下载就是向客户端响应字节数据!

      原来我们响应的都是html的字符数据!

      把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!!

    2. 下载的要求

      * 两个头一个流!

        > Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg

          * 通过文件名称调用ServletContextgetMimeType()方法,得到MIME类型!

        > Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx

          * filename=后面跟随的是显示在下载框中的文件名称!

        > 流:要下载的文件数据!

          * 自己new一个输入流即可!

    ---------------------------

    下载的细节

    1. 显示在下载框中的中文名称时,会出现乱码。

      * FireFoxBase64编码。

      * 其他大部分浏览器:URL编码。

      通用方案:filename = new String(filename.getBytes("GBK"), "ISO-8859-1");

    public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {

    String agent = request.getHeader("User-Agent"); //获取浏览器

    if (agent.contains("Firefox")) {

    BASE64Encoder base64Encoder = new BASE64Encoder();

    filename = "=?utf-8?B?"

    + base64Encoder.encode(filename.getBytes("utf-8"))

    + "?=";

    } else if(agent.contains("MSIE")) {

    filename = URLEncoder.encode(filename, "utf-8");

    } else {

    filename = URLEncoder.encode(filename, "utf-8");

    }

    return filename;

    }

    ---------------------------

    ---------------------------

     源代码:::

    public class Download1Servlet extends HttpServlet {

    @Override

    public void doGet(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException {

    /*

     * 两个头一个流

     * 1. Content-Type

     * 2. Content-Disposition

     * 3. 流:下载文件的数据

     */

    String filename = "E:/Singre.mp3";

    // 为了使下载框中显示中文文件名称不出乱码!

    // String framename = new String("流光%飞舞.mp3".getBytes("GBK"), "ISO-8859-1");

    String framename = filenameEncoding("Singre.mp3", req);

    String contentType = this.getServletContext()

    .getMimeType(filename);//通过文件名称获取MIME类型

    String contentDisposition = "attachment;filename=" + framename;

    // 一个流

    FileInputStream input = new FileInputStream(filename);

    //设置头

    resp.setHeader("Content-Type", contentType);

    resp.setHeader("Content-Disposition", contentDisposition);

    // 获取绑定了响应端的流

    ServletOutputStream output = resp.getOutputStream();

    //commons-io-1.4.jar中的IOUtils

    IOUtils.copy(input, output);//把输入流中的数据写入到输出流中。---输出流的节点就是客户端

    input.close();

    }

    // 用来对下载的文件名称进行编码的!

    public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {

    String agent = request.getHeader("User-Agent"); //获取浏览器

    if (agent.contains("Firefox")) {

    BASE64Encoder base64Encoder = new BASE64Encoder();

    filename = "=?utf-8?B?"

    + base64Encoder.encode(filename.getBytes("utf-8"))

    + "?=";

    } else if(agent.contains("MSIE")) {

    filename = URLEncoder.encode(filename, "utf-8");

    } else {

    filename = URLEncoder.encode(filename, "utf-8");

    }

    return filename;

    }

    }

  • 相关阅读:
    什么时间调用 UpdateData() MFC函数
    网页页面内跳转
    关于SVG文件在Firefox中正确显示的研究
    火车座位号分布情况
    使用“性能监视器”监视系统性能/运行情况
    SQL Server Cache Manager
    SQL连接:localhost、127.0.0.1、(local)的区别
    SQL Server如何保证可空字段中非空值唯一
    SQL 2005使用正则表达式
    從數據讀取資料方法
  • 原文地址:https://www.cnblogs.com/hoobey/p/5436966.html
Copyright © 2011-2022 走看看