protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename");
//此处为get请求方式的做法
filename = new String(filename.getBytes("ISO-8859-1"),"GBK");
System.out.println(filename);
//获取路径
ServletContext context = this.getServletContext();
String path = context.getRealPath("/download/"+filename);
System.out.println(path);
//创建输入流
FileInputStream in = new FileInputStream(path);
/*
* 解决中文名称的文件,下载时文件名丢失问题
*/
//获取客户端浏览器类型
String clientType = request.getHeader("user-agent");
System.out.println(clientType);
//针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE、Chrome ... 使用的是URLEncoder
if(clientType.contains("Chrome")){
/*
* URLEncoder.encode
* Note: The World Wide Web Consortium Recommendation states thatUTF-8 should be used.
* Not doing so may introduceincompatibilities.
* 注:万维网联盟建议使用utf-8。不这样做可能会导致不相容。
*
* 之前误认为浏览器会使用制定的编码格式GBK进行URLDecode解码,
* 使用GBK编码,导致下载后的文件名称 文本.txt变为 login.txt(login为 web.xml中配置的servlet映射)
* filename = URLEncoder.encode(filename,"GBK");
*/
filename = URLEncoder.encode(filename,"UTF-8");
}
System.out.println("编码后的filename"+filename);
response.setHeader("content-disposition", "attachment;filename="+filename);
//输出流输出到客户端
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
in.close();
out.close();
}