java中中文的文件名下载乱码解决方式
Posted hymen-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中中文的文件名下载乱码解决方式相关的知识,希望对你有一定的参考价值。
相信很多人在写下载文件程序是会遇到很多乱码的问题,自己也整理了一下,希望可以帮助到大家。
首先要知道各个浏览器的编码格式是不一样的,下面是一下主流浏览器的编码格式:
各浏览器支持的对应编码格式为:
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);
}
}
以上是关于java中中文的文件名下载乱码解决方式的主要内容,如果未能解决你的问题,请参考以下文章