• 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获取服务器信息大全
    放在IIS上就报错
    WEB资源管理器
    用于主题检测的临时日志(925f1df8130a43969337cfd4cbeb06a4 3bfe001a32de4114a6b44005b770f6d7)
    如何正确的判断String是否为空
    直接输出另存
    查询聊天消息SQL语句!
    ShareSDKUndefined symbols for architecture arm64
    今天起航...
    UIScrollView方法 scrollRectToVisible: animated: 无效(不工作,无效果)的问题
  • 原文地址:https://www.cnblogs.com/hoobey/p/5436966.html
Copyright © 2020-2023  润新知