美文网首页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之文件下载操作

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