在做文件下载的时候,出现了这个错误,找了很久没有找到,希望高手指点,但是文件可以顺利的下载下来,小文件下载不会出错,如果是100多M的文件下载就会出错。不知道为什么连接下载的那个jsp会执行很多次,也就是下面的代码会被循环很多次执行。我下载的代码是写在jsp中,如下:
<%
    InputStream stream = null; //输入流
    OutputStream os = null; //输出流
    String path = request.getSession().getServletContext().getRealPath("/downLoad");  //获得服务器相对路径
    try {
     String filename = request.getParameter("filename").toString();
     File file = new File(path);
     File[] fs = file.listFiles();
     boolean flag = true;
     if(fs!=null && fs.length>0) {
     for(File f:fs){
     if(f.getName().equals(filename)) {
     path = path +file.separator+ f.getName();
     flag = false;
     break;
     }
     }     
     }else {
     %>
     <script type="text/javascript" language="javascript">
     alert("没有文件可以下载!");
     window.history.back();
     </script>
     <%
     return;
     }
     if(flag){
     %>
     <script type="text/javascript" language="javascript">
     alert("该文件已经被下载或不存在!");
     window.history.back();
     </script>
     <%
     return;
     }
        stream = new FileInputStream(path);
        response.setContentType("APPLICATION/DOWNLOAD");
        response.setHeader("Content-Disposition","attachment; filename="+ java.net.URLEncoder.encode(filename,"UTF-8"));
        response.setContentLength(stream.available());
        os = response.getOutputStream();
        out.clear();
    out = pageContext.pushBody(); //解决response.getOutputStream()与response.getWrite()的冲突
    System.out.println("指定的字节写入文件!");
        int iBytesRead = 0,i = 0;
        byte[] buffer = new byte[Byte.MAX_VALUE];
        while ((iBytesRead = stream.read()) != -1) {//buffer, 0, Byte.MAX_VALUE
            os.write(buffer);
        }
        os.flush();
        response.flushBuffer();
    } catch (FileNotFoundException e) {
     System.out.println("FileNotFoundException Error 报错了1!");
       // e.printStackTrace();        
    } catch (IOException e) {
     System.out.println("IOException Error 报错了1!");
        e.printStackTrace();
    }finally{
     if(stream!=null){
     try{stream.close();}catch(Exception e){System.out.println("stream.close()!");throw e;}
     }
    }
%>
错误信息:
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:83)
at org.apache.jsp.jsp.common.jsp.downloadpoliy_jsp._jspService(downloadpoliy_jsp.java:112)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
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 org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
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.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:741)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:765)
at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:118)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:574)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 28 more

解决方案 »

  1.   

    java.net.SocketException: Connection reset by peer: socket write error
    此错误会在你输出文件流后客户端强制中断接收时产生。正常情况下不会产生。
    由你说的“jsp会执行很多次” 可以判断出必然出现这个异常。因为只有一次会正常被客户端接收。
    你只需要解决为什么你的这个页面会多次向客户端浏览器输出就可以了。
      

  2.   

    这个问题找了很久,当我下载的文件超过100M,点击下载,不会通过流去读取文件,当弹出对话框,点击保存的时候,现在又请求了一次这个jsp,并且在就抛出了这个异常,而且我在下载输出的过程中,这个jsp页面也在请求了多次,不知道http是个什么原理,但是如果我下载的文件比较小,便不会出现该异常。控制台的日志是通过System.out.println("指定的字节写入文件!");这句话判断的。
      

  3.   

    等待答案,我今天也碰到了这类错误!下载缓存中的文件报错!不知道为什么,看了很多贴大多说的是浏览器stop掉或关闭了,但是我的没关浏览器,只是点击下载的时候会弹出下载对话框而已,这应该不算是stop了吧,等待带答案~~~~