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