文件下载文件名乱码的几个问题

Java Web后端做文件的下载,各个浏览器之间有兼容性问题,下载文件的文件名可能有乱码,下面总结几个乱码问题和常见解决办法:

firefox文件名乱码的问题:

一般下载文件,都会指明Content-disposition,形如下

response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".txt");

但是这在firefox下,下载的文件名还是会乱码,这是因为firefox严格按照RFC的规定实现,对应的constent-disposition,是如下的格式:

response.setHeader("Content-disposition", "attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(fileName,"UTF-8")+".txt");

所以对于不同的浏览器,就有判断了:

String userAgent=(String)request.getHeader("USER-AGENT"); 
if(useAgent.toLowerCase().contain("firefix")){
    response.setHeader("Content-disposition", "attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(fileName,"UTF-8")+".txt");
}else{
    response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".txt");
}

中英文组合文件名在firefox下载显示不全

解决办法是在fileName外面包一层"然后因为引号转移,需要加斜杠:

response.setHeader("Content-disposition","attachment;filename=\"" + fileName + "\""); 

空格encode之后变成+号的问题

需要在encode之后,手动对+号替换,替换回urlencode的空格,也就是%20

fileName.replaceAll("+","%20");

总结

以上列举出来的,都是一些小技巧,我写完后觉得,如果要彻底解决文件名乱码的问题,最好的办法,还是认真对每一个浏览器做好针对性的解决办法,做成一个工具类。
其次是我上面写到的还是太少,更多内容,更细致的内容,还请看参考部分的博客,质量都很高

参考

  1. 不同浏览器上中文文件名的下载问题
  2. Firefox下载文件时中文名乱码问题
  3. http下载文件,中文文件名在firefox下乱码问题
  4. response.setHeader()的用法

你可能感兴趣的:(Java,知识,Java代码片段)