解决下载文件中文名称乱码(包括IE,edge,Firefox,chrome)

本文详细介绍了在不同浏览器(IE、Firefox、Chrome、Safari)中实现文件下载时,如何正确编码文件名以避免中文乱码问题。通过判断User-Agent,采用UTF-8和ISO-8859-1编码方式,确保文件名在各种浏览器中都能正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中文名称下载文件乱码,主要要做Firefox,IE和chrome这三个浏览器的适配。

IE浏览器 一直就是不走寻常路版本众多,苦逼的就是很多程序员了,经常要个版本浏览器的适配。
下面是常用浏览器的user-agent

IE11

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

IE6

Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2)

edge

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134

FireFox window

Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0

Firefox mac

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0

Google window

Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36

Google mac

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36

Safari mac

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27

注: 以上User-Agent有些是用魔变插件模拟出来的。

  • IE浏览器,它们的User-AGENT可能的关键字有三种可能,MSIETridentEdge。IE浏览器,使用utf-8对文件名编码就可以了, URLEncoder.encode(fileName,“UTF8”);
  • Firefox 可以使用Firefox区分,new String(fileName.getBytes(“UTF-8”), “ISO-8859-1”);
  • chrome,Safari 可以使用上面两种编码方式。
  1. 第一种写法
    /**
    *对下载文件名称进行编码
    *@param request
    *@param response
    *@param fileName 文件名称
    */
    public void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {
    		String userAgent = request.getHeader("USER-AGENT");
    		try {
    			String finalFileName = null;
    			if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent, "Trident") || StringUtils.contains(userAgent,"Edge")){//IE 浏览器
    				finalFileName = URLEncoder.encode(fileName,"UTF8");
    			}else{//火狐,google等其他浏览器
    			   finalFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
    			}
    			response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");//\" 解决Firefox下载英文+中文组合的文件名的问题
    		} catch (UnsupportedEncodingException e) {
    		}
    	}
    
    
  2. 第二种写法
    /**
    *对下载文件名称进行编码
    *@param request
    *@param response
    *@param fileName 文件名称
    */
    public void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {
    		String userAgent = request.getHeader("USER-AGENT");
    		try {
    			String finalFileName = null;
    			if(StringUtils.contains(userAgent, "Firefox")){//火狐浏览器
    			 finalFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");	
    			}else{//IE,google等其他浏览器
    			  finalFileName = URLEncoder.encode(fileName,"UTF8");
    			}
    			response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");//\" 解决Firefox下载英文+中文组合的文件名的问题
    		} catch (UnsupportedEncodingException e) {
    		}
    	}
    
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值