文件下载
发布日期:2021-10-24 12:41:42 浏览次数:1 分类:技术文章

本文共 3110 字,大约阅读时间需要 10 分钟。

下载

  下载就是向客户端响应字节数据!
    原来我们响应的都是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     @Override17     public void doGet(HttpServletRequest req, HttpServletResponse resp)18             throws ServletException, IOException {19         /*20          * 两个头一个流21          * 1. Content-Type22          * 2. Content-Disposition23          * 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

转载于:https://www.cnblogs.com/fengmingyue/p/6082213.html

转载地址:https://blog.csdn.net/weixin_30784141/article/details/98386601 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:如何做一名优秀的电子工程师[zz]
下一篇:创建新DB和新用户&DBeaver连接

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月28日 02时42分25秒