相信很多人在写下载文件程序是会遇到很多乱码的问题,自己也整理了一下,希望可以帮助到大家。
首先要知道各个浏览器的编码格式是不一样的,下面是一下主流浏览器的编码格式:
各浏览器支持的对应编码格式为:
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); } }