zoukankan      html  css  js  c++  java
  • 文件下载

    下载
      下载就是向客户端响应字节数据!
        原来我们响应的都是html的字符数据!下载就是把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!!

      下载的要求
        两个头一个流!
          Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg(通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
          Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx,在filename=后面跟随的是显示在下载框中的文件名称!
          流:要下载的文件数据!自己new一个输入流即可!

      下载的细节

        显示在下载框中的中文名称时,会出现乱码。
          FireFox:Base64编码。
          其他大部分浏览器: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 {
        filename = URLEncoder.encode(filename, "utf-8");
      }
      return filename;
    }

     DEMO

     1 import java.io.FileInputStream;
     2 import java.io.IOException;
     3 import java.net.URLEncoder;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.ServletOutputStream;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 import org.apache.commons.io.IOUtils;
    12 
    13 import sun.misc.BASE64Encoder;
    14 
    15 public class Download1Servlet extends HttpServlet {
    16     @Override
    17     public void doGet(HttpServletRequest req, HttpServletResponse resp)
    18             throws ServletException, IOException {
    19         /*
    20          * 两个头一个流
    21          * 1. Content-Type
    22          * 2. Content-Disposition
    23          * 3. 流:下载文件的数据
    24          */
    25         String filename = "F:/介绍.avi";
    26         // 为了使下载框中显示中文文件名称不出乱码!
    27         //String framename = new String("介绍.avi".getBytes("GBK"), "ISO-8859-1");
    28         String framename = filenameEncoding("介绍.avi", req);
    29         String contentType = this.getServletContext().getMimeType(filename);//通过文件名称获取MIME类型
    30         String contentDisposition = "attachment;filename=" + framename;
    31         // 一个流
    32         FileInputStream input = new FileInputStream(filename);
    33         //设置头
    34         resp.setHeader("Content-Type", contentType);
    35         resp.setHeader("Content-Disposition", contentDisposition);
    36         // 获取绑定了响应端的流
    37         ServletOutputStream output = resp.getOutputStream();
    38         IOUtils.copy(input, output);//把输入流中的数据写入到输出流中。
    39         input.close();
    40     }
    41     // 用来对下载的文件名称进行编码的!
    42     public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
    43         String agent = request.getHeader("User-Agent"); //获取浏览器
    44         if (agent.contains("Firefox")) {
    45             BASE64Encoder base64Encoder = new BASE64Encoder();
    46             filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    47         } else {
    48             filename = URLEncoder.encode(filename, "utf-8");
    49         }
    50         return filename;
    51     }
    52 }
    Download1Servlet
  • 相关阅读:
    Django基础七之Ajax
    Django基础六之ORM中的锁和事务
    Django基础五之django模型层(二)多表操作
    Django基础五之django模型层(一)单表操作
    Django基础四之模板系统
    Django基础三之视图函数
    Django基础二之URL路由系统
    转移博客
    Unity开发一些实用的提高效率的技巧
    2019.2.23VScode的c++配置详细方法
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6082213.html
Copyright © 2011-2022 走看看