zoukankan      html  css  js  c++  java
  • javaWeb项目-文件下载的消息头和编码问题

    一、问题:

      做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置?

    二、解决:

      1、例子

    //设置响应的消息头
    response.setContentType("text/html;charset=UTF-8");
    //设置响应类型中包含文件附件 response.setHeader(
    "Content-Disposition", "attachment; " + "filename="+new String(AREA_FILE.getBytes("gb2312"), "ISO-8859-1"));

      2、setContentType:

        它的作用就是,设置客户端的MIME类型【多类型邮件传输协议】,浏览器可以根据该类型来指定程序解析对应类型的文件

        比如,servlet里写入了一个 <jpg> 标签,如果不指定为jpg类型,页面是不能直接显示的

        它的默认类型是[text/html]类型,所以返回的是html也可以不设置

        包括下载文件的时候,不指定也是可以的,因为后边还设置了携带的响应附件,可以支持文件的下载

        也可以指定响应的编码,让浏览器可以正确的显示信息

      3、setHeader

        它的作用就是设置响应的头部

        Content-Disposition:指明响应的配置信息

        attachment:指明包含附件

      4、new String(AREA_FILE.getBytes("gb2312"), "ISO-8859-1"))

        这里特别说明,如果文件名不包含中文可以不设置该项

        如果包含中文名,则需要设置编码,否则文件名下载后中文字符会乱码

        其中,getBytes指定了编码的方式,ISO-8859-1指定了解码(读取)的方式

        想要转换编码,就是先编码,再解码

        如:

          utf-8转gbk :new String(str.getBytes("gbk"), "gbk"))

          gbk转utf-8 :new String(str.getBytes("utf-8"), "utf-8"))

        

    三、扩展:

      那么为什么下载的文件名中的中文字符会乱码?

      首先,我们常用的编码:

      (1)ISO-8859-1:它是单字节编码,tomcat默认的字符编码方式,但是可以标识的字符量比较少

      (2)unicode:单字节编码

      (3)gb2312:我们大中国的汉字编码,两个字节标识一个汉字

      (4)UTF-8:万国码,支持世界字符,是可变的长度编码,字节数不定

      乱码的出现就是因为,java的字符串默认采用的编码是unicode编码,而tomcat传输又更改为iso-8859-1,

      页面读取的时候,碰到汉字本来双字节的读取成了单字节,出现了乱码

      所以要把字符串以【gbk】编码,再以【iso-8859-1】读取相应的字符,传递到页面就是【iso-8859-1】,可以正常显示中文字符


      

      

  • 相关阅读:
    为什么杜蕾斯的文案工资月薪5万?
    在独立音乐上,网易云音乐是如何甩了其他音乐平台几条街?
    两次大战,为什么德国成不了世界霸主呢?
    在大城市打拼的你,是想留下还是想攒够了钱回家?
    生存在互联网公司是种怎样的体验?
    5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
    放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权
    中国唯一的科技城
    互联网圈的6大奇葩大产品经理:张小龙不在乎手机碎屏,马化腾让用户一秒变白痴
    为什么说中国快递分两种:一种叫顺丰,一种叫快递?
  • 原文地址:https://www.cnblogs.com/hackxiyu/p/9046247.html
Copyright © 2011-2022 走看看