求助:tomcat在linux上传文件时报出broken pipe

w137459045 2012-04-18 04:03:05
开发环境:windows+myEclipse8.0+tomcat6.0+mysql
用到的web框架:Struts2+Spriing3.0+hibernate3.0
部署环境:suse Linux+tomcat6.0+mysql,传输速度1M左右
具体操作如下:
选择文件进行上传时,文件大概是7.8M的XML,点击提交之后,无任何提示,直接跳转到“页面无法找到”如图
看tomcat的日志,在日志文件localhost-时间.log找到该异常:

ClientAbortException: java.net.SocketException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:307)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:286)
at org.apache.catalina.connector.Response.flushBuffer(Response.java:541)
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:344)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:211)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:817)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:623)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:444)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Broken pipe
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$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:772)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:123)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:579)
at org.apache.coyote.Response.doWrite(Response.java:559)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351)
... 13 more

然后在struts2指定的临时目录中找到了刚才上传的文件,只有8K左右
好像是链接被重置了,如果上传小于1k的文件没有该问题
我用Wireshark抓包工具抓了一下包,发现在收到几个包之后收到了rest包,这个问题解决了3天了毫无结果,那位大侠知道的话,请指点一下,小弟万分感激!
...全文
591 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
w137459045 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
文件上传的时候。。。struts中是否设置了最大上传的文件大小?

另:那么大的文件,难道是一次读取7.8M在内存中,然后一次性刷入文件的?

建议:
1. 读取和写入数据采用对象数组序列化方式。。
2. 或者Byte数组方式读取写入。。千万不要一行一行的操作。。
3. 还可以分批做flush,往文件中刷。。
[/Quote]
<constant name="struts.multipart.maxSize" value="536870912" />
<constant name="struts.multipart.saveDir" value="/home/xxx/temp" />
struts配置文件中设置了大小为512M,
我的文件上传直接用struts中的common-fileUpload组件,没有直接进行流的处理,
刚才用采用了servlet进行对文件上传有报出java.net.SocketException: Connection reset,

非常感谢您的回复
kouyiSC 2012-04-18
  • 打赏
  • 举报
回复
文件上传的时候。。。struts中是否设置了最大上传的文件大小?

另:那么大的文件,难道是一次读取7.8M在内存中,然后一次性刷入文件的?

建议:
1. 读取和写入数据采用对象数组序列化方式。。
2. 或者Byte数组方式读取写入。。千万不要一行一行的操作。。
3. 还可以分批做flush,往文件中刷。。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧