美文网首页Java 杂谈码蚁IT
13-码蚁JavaWeb之文件下载操作

13-码蚁JavaWeb之文件下载操作

作者: 码蚁Q | 来源:发表于2018-09-24 08:47 被阅读14次

需求

把服务器当中的文件直接下载到电脑当中

下载文件方式

1.直接使用a标签来去下载
    有些内容会浏览器自动解析
    浏览器不能解析的文件才会被下载     
    
2.通过发送Servlet请求来去下载
  通过发送一个Servlet请求,把文件名发送给服务器
  发送给服务器后,接收到文件名参数,获取文件的绝对地址
  通过流的形式来去写到浏览器
  还得要告诉文件是什么类型
  浏览器是以MIME的类型来识别类型
  this.getServletContext().getMimeType(“文件名称”)
  设置响应的类型
  res.setContentType("MIME类型")
  设置响应头,告诉浏览器不要去解析,是以附件的形式打开,
  res.setHeader("Content-Dsiposition","attachment;filename="+文件名)

步骤
1.接收文件名参数
2.获取mime类型
3.设置浏览器响应类型
4.告诉浏览器以附件形式下载
5.获取文件的绝对路径
6.读取文件流
7.获取输出流
8.把内容写出到输出流

示例代码

    //1.接收文件名参数
    String filename = request.getParameter("filename");
    String mime = this.getServletContext().getMimeType(filename);
    response.setContentType(mime);
    response.setHeader("Content-Disposition", "attachment;filename="+filename);
    //2.获取文件的绝对路径
    String path = this.getServletContext().getRealPath("download/"+filename);
    System.out.println(path);
    //3.读取文件流
    FileInputStream in = new FileInputStream(path);
    //4.获取输出流
    ServletOutputStream out = response.getOutputStream();
    //5.把内容写出到输出流
    byte[] buffer = new byte[1024];
    int len = 0;
    while((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
    }

解决中文名称乱码问题

获取中文参数报错问题
高版本tomcat中的新特性:
就是严格按照 RFC 3986规范进行访问解析,
而 RFC 3986规范定义了Url中
只允许包含英文字母
(a-zA-Z)、数字(0-9)、-_.~4个特殊字符
以及所有保留字符(RFC3986中
指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])

解决办法

.../conf/catalina.properties中,找到最后注释掉的一行 #
tomcat.util.http.parser.HttpParser.requestTargetAllow=|  ,改成
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行
1.把获取的字符串参数的字节码获取,再重新使用utf-8编码
2.在设置以附件形式打开时, 不同的浏览器会对默认的名字进行解码
所以根据不同的浏览器,要对名称进行编码之后,再放入文件名
对文件名进行编码
不同的浏览器编码不一样
要先获取agent,取出浏览器的类型
根据不同的浏览器类型进行编码
步骤
1.接收文件名称
2.获取mimeType
3.设置浏览器响应类型
4.先对传入的参数转成二进制流,再使用UTF-8进行编码
5.获取浏览器的信息
6.判断是哪一种浏览器,根据不同的浏览器获取一个编码的文件名
7.设置以附件形式下载,传的名称是编码过的名称 
8.获取文件的绝对路径
9.读取文件流
10.获取输出流
11.把文件写到响应当中

示例代码

// 获取客户端信息
String agent = request.getHeader("User-Agent");
// 定义一个变量记录编码之后的名字
String filenameEncoder = "";
if (agent.contains("MSIE")) {
    // IE编码
    filenameEncoder = URLEncoder.encode(filename, "utf-8");
    filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
    // 火狐编码
    BASE64Encoder base64Encoder = new BASE64Encoder();
    filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
    // 浏览器编码
    filenameEncoder = URLEncoder.encode(filename, "utf-8");
}

博文全套 视频讲解 点击以下链接查看
https://study.163.com/course/courseMain.htm?courseId=1005981003&share=2&shareId=1028240359

相关文章

  • 13-码蚁JavaWeb之文件下载操作

    需求 把服务器当中的文件直接下载到电脑当中 下载文件方式 步骤1.接收文件名参数2.获取mime类型3.设置浏览器...

  • SpringMVC之文件上传和下载

    SpringMVC实现文件的上传和下载相对于JavaWeb阶段我们使用过servlet实现文件上传和下载操作;而S...

  • 10-码蚁JavaWeb之HttpServlet

    HttpServlet简介 HttpServlet父子关系 HttpServlet方法 HttpServlet容器...

  • 06-码蚁JavaWeb之Servlet

    学习地址:撩课-JavaWeb系列1之基础语法-前端基础撩课-JavaWeb系列2之XML撩课-JavaWeb系列...

  • 12-码蚁JavaWeb之Response

    一、response响应过程 牢记响应的流程图 二、学习响应 通过response设置响应行,响应头 ,响应体 设...

  • 07-码蚁JavaWeb之反射

    一、类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中系统会通过加载,连接,初始化三步来实现对这个类进...

  • 11-码蚁JavaWeb之ServletContext

    什么是ServletContext ServletContext的生命周期 如何获得上下文 获取全局的初始化参数 ...

  • JavaWeb文件下载

    java 文件下载 在此之前需要先简绍一下常见的MIME类型,以供之后使使用: 下载代码实例: 关于setChar...

  • javaweb文件下载

    //jsp download //servlet public void doPost(HttpServletRe...

  • JavaWeb之文件上传与下载

    文件上传 准备 1、请求方式为 POST 2、使用表单域为 file 3、使用multipart/form-dat...

网友评论

    本文标题:13-码蚁JavaWeb之文件下载操作

    本文链接:https://www.haomeiwen.com/subject/ehscoftx.html