javaweb下载文件中文名称乱码问题

946 阅读1分钟

1 解决方案

String orgOutName = "这是一张图.jpg";
String outName = URLEncoder.encode(orgOutName, "UTF-8");
if(request.getHeader("user-agent")!=null){    
    UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("user-agent"));
    Browser browser = userAgent.getBrowser();
    if(browser.getName()!=null && browser.getName().equals("Safari")){
        outName = new String(orgOutName.getBytes("UTF-8"),"ISO-8859-1");    
    }
}
response.setHeader("Content-Disposition","attachment;filename="+outName);

其中用到工具

<dependency>
   <groupId>eu.bitwalker</groupId>
   <artifactId>UserAgentUtils</artifactId>
   <version>1.20</version>
</dependency>

2 分析过程

1)获取各个浏览器请求时的user-agent

Chrome:user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
   AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 
IE:user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko 
Edge:user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
   AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363 
FireFox:user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) 
   Gecko/20100101 Firefox/76.0 
Safri:user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) 
   AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Safari/605.1.15

2)各个方法在各种浏览器中的乱码情况

String  outName = new String(orgOutName.getBytes("GBK"),"ISO-8859-1");
  chrome,ie(表示使用此种方法不会乱码的浏览器)

String  outName = new String(orgOutName.getBytes("UTF-8"),"ISO-8859-1")
  chrome,firefox,safri

String outName = URLEncoder.encode(orgOutName, "UTF-8");
  chrome,ie,firefox,edge