在做文件下载的时候,出现了这个错误,找了很久没有找到,希望高手指点,但是文件可以顺利的下载下来,小文件下载不会出错,如果是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
<%
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
解决方案 »
- 怎样才能使action执行后,仍停留在当前页面?
- mssql转mysql
- 求用javascript实现计数功能,并且不能刷新就能加1的?
- 急求:jspSmartUpload的下载地址,官方网站没有找到,那位好心的大哥给个链接,谢谢了
- 出这个错是怎么回事??description The server encountered an internal error () that prevented it from fulfilling this request.
- 请各位大大帮帮忙!!帮顶也有分!!多谢多谢!!!!
- [急,200分求救]我用utf-8编码,form的提交方式如果不是post方式,接收页面会有乱码.
- 这几句是什么意思
- 编译出错,请帮助解决
- 关于websocket 的连接问题
- 在用struct2开发时,提示如下错误怎样解决呀?(好像是web.xml中的过滤器问题)
- java如何用JDBC连接数据库?
此错误会在你输出文件流后客户端强制中断接收时产生。正常情况下不会产生。
由你说的“jsp会执行很多次” 可以判断出必然出现这个异常。因为只有一次会正常被客户端接收。
你只需要解决为什么你的这个页面会多次向客户端浏览器输出就可以了。