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;

    }

    }

  • 相关阅读:
    ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
    ASP.NET Web API 框架研究 核心的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
    ASP.NET Web API 框架研究 ASP.NET Web API 路由
    ASP.NET Web API 框架研究 ASP.NET 路由
    ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
    MVVM模式
    RESTful Web API 理解
    C# 函数式编程及Monads.net库
  • 原文地址:https://www.cnblogs.com/hoobey/p/5436966.html
Copyright © 2011-2022 走看看