博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中中文的文件名下载乱码解决方式
阅读量:4552 次
发布时间:2019-06-08

本文共 1634 字,大约阅读时间需要 5 分钟。

相信很多人在写下载文件程序是会遇到很多乱码的问题,自己也整理了一下,希望可以帮助到大家。

首先要知道各个浏览器的编码格式是不一样的,下面是一下主流浏览器的编码格式:

各浏览器支持的对应编码格式为: 

1.  IE浏览器,采用URLEncoder编码 
2.  Opera浏览器,采用filename*方式 
3.  Safari浏览器,采用ISO编码的中文输出 
4.  Chrome浏览器,采用Base64编码或ISO编码的中文输出 
5.  FireFox浏览器,采用Base64或filename*或ISO编码的中文输出 

其中遇到了很多问题,当后台获取前台的文件名称时调用request.getParameter("filename")有一个坑,获取的文件名称的编码格式为ISO-8859-1格式的编码,后台不认识,怎么解决呢?利用String的构造将编码格式改为utf-8

//代码如下

String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");

System.out.println(filename);
String type = this.getServletContext().getMimeType(filename);
//设置到头中
response.setHeader("Content-Type",type);
//获取文件的流对象服务器中的编码格式是工作空间的编码格式
InputStream is = this.getServletContext().getResourceAsStream("/download/"+filename);
//判断用户浏览器修改编码格式必须要在修改头信息之前,要不然会乱码
String agent = request.getHeader("User-Agent");
if(agent.contains("Goole")){//这里只用了两个编码格式
//base64编码格式
filename = base64EncodeFileName(filename);
}else{
  filename = URLEncoder.encode(filename, "UTF-8");
}
//设置每个文件的打开方式都为下载
response.setHeader("Content-Disposition","attrchment;filename="+filename);
//创建写入流
OutputStream os = response.getOutputStream();
int len = 0 ;
byte[] by = new byte[1024];
while((len= is.read()) != -1){
os.write(by,0,len);
}
//关流 只需要关闭一个流即可os流会在response对象响应完成后自动关闭
is.close();
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

 

转载于:https://www.cnblogs.com/Hymen-/p/9049007.html

你可能感兴趣的文章
docker swarm集群
查看>>
docker 部署jar包
查看>>
在Nginx容器安装Keepalived后端项目双机热备
查看>>
Docker打包部署前端项目与负载均衡
查看>>
一款阿里开源的 Java 诊断工具
查看>>
阿里云云盾安全事件提醒:挖矿程序
查看>>
redis安装(linux)
查看>>
mysql自定义函数多表更新:update_order_relation()
查看>>
UUID与时间戳
查看>>
SimpleDateFormat 线程安全的解决方案--DateTimeFormatter
查看>>
mysql不常用查询
查看>>
win下PowerShell的簡單使用
查看>>
windows下安装redis
查看>>
redis簡單命令
查看>>
git问题记录
查看>>
如何将jar包打包到本地maven仓库
查看>>
idea修改maven项目名
查看>>
idea远程调试tomcat部署项目(windows环境)
查看>>
@Slf4j注解
查看>>
maven仓库镜像、私服与jdk版本配置
查看>>