文件下载

Posted 凌晨三点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件下载相关的知识,希望对你有一定的参考价值。

下载
  下载就是向客户端响应字节数据!
    原来我们响应的都是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

以上是关于文件下载的主要内容,如果未能解决你的问题,请参考以下文章

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

代码片段 PHP,预期文件结尾,我错在哪里?

代码适用于与单个 html 文件不同的堆栈片段

VS code自定义用户代码片段snippet

Java itext为pdf 文件添加水印核心功能代码片段

VSCode自定义代码片段——声明函数