response.setContentType("application/octet-stream;charset=UTF-8");
fileName=java.net.URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
此时在ie下面点击文件下载的时候能够正确显示中文名称但是此时在firefox下面却显示1_%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6123.doc然后我又试了另一种方案

response.setContentType("application/octet-stream;charset=UTF-8");
fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
此时在ie下面下载的时候弹chu的文件名是乱码;而在firefox下面却正确显示1_中文文件XXX.doc。

我想要的是不管是ie还是firefox都正确显示1_中文XX.doc,不知道大家有没有遇到过类似的问题,解决之道是什么?
也许判断浏览器类型来进行不同的处理会是一种解决方案,但是这是一种个人觉得迫不得已的解决方案。

=================工具类=============================
package com.jub.jubweb1.JTool;

import javax.servlet.http.HttpServletRequest;

public  class  JToolWeb {
 
 //文件下载时文件名在ie和firefox下面表现不一致问题,乱码
 public static String processFileName(HttpServletRequest request,String fileNames){
  String codedfilename = null;
  try{
  String agent =request.getHeader("USER-AGENT");
  if(null != agent && -1 != agent.indexOf("MSIE")){//ie
  String prefix = fileNames.lastIndexOf(".")!=-1?fileNames.substring(0,fileNames.lastIndexOf(".")):fileNames;
  String extension = fileNames.lastIndexOf(".")!=-1?fileNames.substring(fileNames.lastIndexOf(".")):"";
  String name = java.net.URLEncoder.encode(fileNames, "UTF8"); 
  if(name.lastIndexOf("%0A")!=-1){
  name = name.substring(0,name.length()-3);
  }
  int limit = 150 - extension.length();//文件名超过 17 个中文字符,在 IE 下会有问题
  if (name.length() > limit) {
   name = java.net.URLEncoder.encode(prefix.substring(0, Math.min(prefix.length(), limit / 9)), "UTF-8"); 
   if(name.lastIndexOf("%0A")!=-1){
   name = name.substring(0,name.length()-3);
   }
  }else{
   return name;
  }
  codedfilename = name + extension;  
  } else if (null != agent && -1 != agent.indexOf("Mozilla")) {//火狐
  codedfilename = "=?UTF-8?B?"+(new String(org.apache.commons.codec.binary.Base64.encodeBase64(fileNames.getBytes("UTF-8"))))+"?=";
  }else {
  codedfilename = fileNames;
  }
  }catch(Exception e){
   e.printStackTrace();
  }
  return codedfilename;
 }
}

=================================jsp============================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8;" import="java.io.*,com.jub.jubweb1.JTool.*" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>下载</title>
</head>
<body>
<%
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
//关于文件下载时采用文件流输出的方式处理: 
//加上response.reset(),并且所有的%>后面不要换行,包括最后一个; 
///response.reset();//可以加也可以不加  ,注意加了之后tomcate需要配置UTF-8否则乱码
String filePath=request.getSession().getServletContext().getRealPath("")+request.getParameter("path");
File file = new File(filePath);
if (!file.exists() || file.isDirectory()) {
 filePath=new String(filePath.getBytes("iso-8859-1"),"UTF-8");//防止tomcate编码不一
 file = new File(filePath);
 if (!file.exists() || file.isDirectory()){//二次验证
 %>
 <script type="text/javascript" charset="UTF-8">
  alert('抱歉,资源正在维护中,请稍后再试,如果有需要请联系我们的客服,谢谢!');
 </script>
 <%
 System.out.print(filePath);
 return;
 }
}
String fileName=filePath.substring(filePath.lastIndexOf("\\")+1,filePath.length());
System.out.print(fileName);
System.out.print(filePath);
//filename=new String(filename.getBytes("iso8859-1"),"gb2312");//使用超链接解决中文乱码
// 设置响应头和下载保存的文件名
response.setContentType("application/x-download"); 
//response.addHeader("Content-Disposition","attachment;filename=" +new String(fileName.getBytes("gb2312"),"iso8859-1"));//解决中文乱码
//response.addHeader("Content-Disposition","attachment;filename=" + java.net.URLEncoder.encode(fileName,"utf-8"));//解决中文乱码
String t=JToolWeb.processFileName(request,fileName);
response.addHeader("Content-Disposition","attachment;filename="+t);//解决中文乱码
System.out.println(t+"--------");
response.setContentLength((int)file.length());
java.io.OutputStream outp = null;
java.io.FileInputStream in = null; 
try 

outp = response.getOutputStream(); 
in = new FileInputStream(file); 
 
byte[] b = new byte[1024]; 
int i = 0; 
 
while((i = in.read(b)) > 0) 

outp.write(b, 0, i); 

// 
outp.flush(); 
//要加以下两句话,否则会报错 
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response   
out.clear(); 
out = pageContext.pushBody(); 

catch(Exception e) 

System.out.println("Error!"); 
e.printStackTrace(); 

finally 

if(in != null) 

in.close(); 
in = null; 

//这里不能关闭   
//if(outp != null) 
//{ 
//outp.close(); 
//outp = null; 
//} 
}
%>
</body>
</html>

===========================jsp==================================
 <a href='javascript:subFrom("/jubweb1/down/down_stream.jsp","\\download\\erp\\行政管理手册.doc")'>下载</a>
 <!--下载使用的表单-->
  <form id="down_frm" name="down_frm" method="post" target="down_if"  style="display:none;">
  <input type="hidden" id="path" name="path"/>
  </form>
  <iframe  id="down_if" name="down_if" style="display:none;"></iframe><!--下载使用的iframe-->
  <script>
  
  function subFrom(url,param){
   $("#path").attr("value",param);
   $("#down_frm").attr("action",url);
   $("#down_frm").attr("method","post");
   $("#down_frm").submit();
     }
  </script>

最新文章

  1. browsersync实现网页实时刷新(修改LESS,JS,HTML时)
  2. Java网络编程——概述
  3. iOS开发小技巧--利用MJExtension解决数据结构复杂的模型转换
  4. 在Swift中应用Grand Central Dispatch(上)转载自的goldenfiredo001的博客
  5. 【转】java编译错误 程序包javax.servlet不存在javax.servlet.*
  6. LinqToExcel: LINQ查询Excel电子表格
  7. homework_06 围棋程序改进
  8. Python参数中的*和**
  9. 在Ubuntu上下载、编译和安装Android最新源代码
  10. linux系统管理--查看进程
  11. 怎样做才是最优雅方式切换 web 项目数据源 ?
  12. asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问
  13. Space Time Varying Color Palette
  14. 软件工程实践小项目之模拟wc.exe的小程序
  15. oracle 迁移
  16. [AtCode 4104] Small and Large Integers
  17. maven 介绍(zz )
  18. Kafka: Connect
  19. spring-data-jpa+hibernate 各种缓存的配置演示
  20. lua知识点整理

热门文章

  1. [asp.net] 通过JS实现对treeview控件的复选框单选控制。
  2. HDU1495 非常可乐
  3. php的header()大全
  4. 1、c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以
  5. MYSQL中 ENUM、SET 类型(建议用tinyint代替)
  6. mysql存贮过程编写
  7. [转]linux之nl命令
  8. Cocos2d-android (06) 屏幕触摸事件及坐标转换
  9. 全方位掌握 NSIS 的操作
  10. 关于python中字典的一些总结