struts1做文件下载,ie本地文件下载没有问题,但是用迅雷下载时,后台会报clientAbortException,但是下载文件正确。出现以下异常:
2010-07-09 11:37:45,125 [ERROR] cn.edu.APM.service.CommonExcelService.downloadFile(CommonExcelService.java:125) ClientAbortException:  java.io.IOException
ClientAbortException:  java.io.IOException
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309)
at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:273)
at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:104)
at cn.edu.APM.service.CommonExcelService.downloadFile(CommonExcelService.java:130)
at cn.edu.APM.presentation.NoticeBean.downloadAttach(NoticeBean.java:857)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.beanaction.ActionInvoker.invoke(ActionInvoker.java:16)
at org.apache.struts.beanaction.DefaultActionInterceptor.intercept(DefaultActionInterceptor.java:5)
at org.apache.struts.beanaction.BeanAction.execute(BeanAction.java:246)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at cn.edu.APM.domain.AuthFilter.doFilter(AuthFilter.java:60)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at cn.edu.APM.domain.Filters.doFilter(Filters.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.IOException
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:696)
at org.apache.coyote.http11.InternalAprOutputBuffer$SocketOutputBuffer.doWrite(InternalAprOutputBuffer.java:726)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:124)
at org.apache.coyote.http11.InternalAprOutputBuffer.doWrite(InternalAprOutputBuffer.java:532)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
下载代码如下:byte b[] = new byte[100];
OutputStream outstream = null;
FileInputStream in = null;
File file = new File(pathname);//pathname为文件路径
try{
in = new FileInputStream(file);
outstream = response.getOutputStream();
/*设置报头信息,弹出窗口中显示的文件名  */
String docname = java.net.URLEncoder.encode(filename,"UTF-8");//filename为文件名
response.setHeader("Content-disposition", "attachment;filename=" + new String(docname.getBytes("utf-8"), "GBK"));//回复响应给用户文件下载对话框
int n = 0;
while((n = in.read(b))!=-1){
outstream.write(b,0,n);
}
outstream.flush();
}
catch(IOException e){
   e.printStackTrace();
   logger.error(e.toString());
}
finally{
try{
in.close();
outstream.close();
}
catch(IOException e){
 e.printStackTrace();
logger.error(e.toString());
}
}请问有什么方法可以排除这种异常呢?网上查了资料,也没有好的解决办法,如果把异常写到日志文件的话,日志文件会疯狂增长 。
另有一问题:我在导出文件时,因为是直接调用action,没有传递链接参数,所以迅雷无法解析文件名,显示action.do的样式,因为导出文件的文件路径无法在点击按扭之前确定,所以没有办法传参,请问有没有什么解决方法可以让文件名被迅雷捕获呢?

解决方案 »

  1.   

    我用的struts2下载,也是会出现这个问题,保存时点击取消。就报这个错误
      

  2.   

    暂时屏蔽掉该异常吧。如下:catch (IOException ex) {
        String name = ex.getClass().getName();
        if(name==null || name.indexOf("ClientAbortException")<0){
             // write log....
        }
    }
      

  3.   

    设置一下要下载的文件的MIME类型,比如说要下载的是一个1.jpg的图片,则
    response.setHeader("content-disposition","attachment;filename=1.jpg");
    response.setContentType("image/jpeg");
    这样试试,看行不行?