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);
}
}

猜你喜欢

转载自www.cnblogs.com/Hymen-/p/9049007.html