日期:2014-05-16  浏览次数:20344 次

JSP实现下载的痛苦[word、excel、下载乱码] 彻底解决 下载文件内容及文件名乱码
1: 建议以后都不要用JSP来实现下载,最好用 servlet的方式来实现。。。
2: 如果一定要实现JSP方式来下载,最好页面内java代码体外(<%%>符号外)不要包含任何内容(空格与回车也不可以有)
3: 当然java代码部分可以有空格 和 回车
4: 具体实现代码如下:
<%@ page language="java" pageEncoding="gbk"%><%@ page import="org.apache.commons.logging.Log,org.apache.commons.logging.LogFactory" %><%
   
   Log log = LogFactory.getLog(this.getClass());
   String name_cn=(String)request.getAttribute("name_cn");///获取文件名称 格式 sss.doc
   String abstrUrl=(String)request.getAttribute("abstrUrl");//获取文件相对或绝对路径,为空走默认!
   
   response.setContentType("application/octet-stream;charset=gbk"); // charset=gb2312
   String ffnmae=new String(name_cn.getBytes("gb2312"),"iso8859-1");//格式化 名称
   response.setHeader("Content-Disposition","attachment; filename="+ffnmae);

   java.io.FileInputStream in = null;   
   java.io.BufferedInputStream binpu = null;
   java.io.BufferedOutputStream bout = null;
   try{     
    in = new java.io.FileInputStream(abstrUrl);   
    binpu = new java.io.BufferedInputStream(in);
    bout = new java.io.BufferedOutputStream(response.getOutputStream());
    byte[] b = new byte[1024];   
    int i = 0;   
    while((i = binpu.read(b,0,b.length)) > 0){   
     bout.write(b, 0, i);   
    }       
    bout.flush(); 
    //要加以下两句话,否则会报错    
    out = pageContext.pushBody(); 
    response.flushBuffer();
    out.clear();   
   }catch(Exception e){   
    log.error("下载错误,错误URL:"+abstrUrl, e);
   }finally{   
    if(in != null){   
     try {
      in.close();
     } catch (java.io.IOException e) {
      log.error("关闭文件错误", e);
     }  
     in = null;   
    }  
    if(binpu != null){   
     try {
      binpu.close();
     } catch (java.io.IOException e) {
      log.error("关闭输入流错误", e);
     }    
     binpu = null;   
    }  
    if(bout != null){   
     try {
      bout.close();
     } catch (java.io.IOException e) {
      log.error("关闭输出流错误", e);
     }   
     bout = null;   
    }  
   }
%>