我也遇到同样问题至今没有解决,在tomcat下是会出现的,在weblogin下虽不会出此异常但弹也下载对话中无法显示中文文件名.如下:
<%@ page import="java.io.*" %>
<%
try {  String fileName=converStr(request.getParameter("FileName"));
  String serverFileName =request.getParameter("ServerFileName");  String url="D:/beaTest/user_projects/mydomain1/applications/QHOA/"+"upload/document/"+serverFileName;
  System.out.println("fileName="+fileName);//此处可以输也正常的中文文件名
  FileInputStream inStream=new FileInputStream(url);
  ServletOutputStream os=response.getOutputStream();
  //设置输出的格式
  response.reset();
  response.setContentType("application/x-msdownload");
  response.setHeader("Content-Disposition", "attachment; filename="+fileName);
  //循环取出流中的数据
  byte[] b = new byte[1024];
  int len;
  while((len=inStream.read(b)) >0){
    os.write(b,0,len);
  }
  inStream.close();
  os.close();
}catch(IOException ex){
  //ex.printStackTrace();
}%><%!
 /*
  * 字符转换
  * @ param str
  * @ return
  */
  private synchronized String converStr(String str)
  {
    String _str="";
    try
    {
      _str=new String(str.getBytes("ISO-8859-1"));
    }
    catch (Exception e){}
    return _str;
  }
    %>

解决方案 »

  1.   

    是不是说已经调用过一次getOutputStream()了,就不需要每次都写一遍response.getOutputStream()。
    试试看OutputStream os = response.getOutputStream();然后代码中response.getOutputStream()都用os代替掉。
      

  2.   

    TimesNewRoman() :
    你说的那个我试过了  还是报与上面相同的错
      

  3.   

    先帮你UP一下。
    多了几行可能是因为b的大小是100,write(b)的时候是写入大小为b的数据,而最后一次的len是小于100的。
      

  4.   

    http://expert.csdn.net/Expert/topic/1912/1912802.xml?temp=1.284426E-02
    看看,应该有用