我也遇到过这种问题,转换一下编码就没事了.下面是我的源代码:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,java.io.*"%>
<%@ include file="../inc/myfun.jsp"%>
<%
  String filePath=myfun.getGBStr("cclj",request);//取得文件的相对存储路径
  String realPath=(config.getServletContext()).getRealPath(filePath);//取得文件的绝对存储路径
  File file=new File(realPath);//根据绝对路径创建文件对象
  if(!file.exists()){ //判断文件是否存在
%>
<script language="javascript">
<!--
  alert("对不起,您要下载的文件不存在!");
  self.close();
//-->
</script>
<%
  return;
  }
  int len=(new Long(file.length())).intValue();  String fileName=new String((file.getName()).getBytes(),"iso-8859-1"); //转换编码,取得文件名,这样就不会出现乱码了  response.reset();
  response.setContentType("application/octet-stream;charset=gbk"); //设置输出响应流的消息头
  response.setHeader("Content-disposition","attachment;filename=\""+fileName+"\"");
  BufferedInputStream infile=new BufferedInputStream(new FileInputStream(file));
  BufferedOutputStream outfile=new BufferedOutputStream(response.getOutputStream()); 
  int buffersize=1024;
  
  try{
      int total=0;
  int once=0;
      byte[] buffer=new byte[buffersize];
  do{
      once=infile.read(buffer); //读取文件到字节缓冲区
  total=total+once;
  if(once>=0)
      outfile.write(buffer,0,buffersize); //将文件写入输出响应流
  }while(total<len&&once>=0);
  response.flushBuffer();
  }
  catch(Exception e){ 
  }finally{
      if(infile!=null) infile.close();
  if(outfile!=null) outfile.close();
  }
  
%>