处理multipart / form-data请求失败。 读取超时

关于Stack Overflow的其他问题已经解决了这个问题,但是所提供的答案都没有帮助我解决这个问题。

我正在尝试使用Apache HTTP Commons从applet上传一个介于10 kB到16 MB之间的文件。 在我的本地环境中一切正常。

我只在我的生产服务器(Tomcat 6.0, https://www.dailyrazor.com/ )上收到以下exception,无论文件大小如何:

org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. Read timed out at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:384) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:116) at com.actura.helper.UploadHelper.processUpload(UploadHelper.java:92) at com.actura.voice.upload.FileUploadServlet.process(FileUploadServlet.java:85) at com.actura.voice.upload.FileUploadServlet.doPost(FileUploadServlet.java:75) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 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.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.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) at java.lang.Thread.run(Thread.java:662) 

这是Commons IO的调试日志:

 2012-Sep-18 11:26:28,446 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory constructor (listener) 2012-Sep-18 11:26:28,794 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:26:28,800 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:26:28,800 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:26:28,802 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() processing folder... /home/dixieh83/public_html/ActuraVoiceRecorderDemo/temp 2012-Sep-18 11:27:47,062 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory constructor (listener) 2012-Sep-18 11:27:47,461 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:27:47,461 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory DEBUG inside MonitoredDiskFileItemFactory createItem 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside MonitoredDiskFileItem constructor 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG inside getOutputStream() 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG inside MonitoredOutputStream constructor 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream DEBUG leaving MonitoredOutputStream contructor 2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem DEBUG leaving getOutputStream() 

除了这个上传问题,我的applet工作正常。

这是我的生产服务器的server.xml文件中描述的服务器配置:

   

我的互联网连接的速度很好(下降2.01 Mbps和0.42 Mbps),所以这个例外让我感到困惑。 我已经将connectionTimeOut设置为3000000,但我仍然有例外。 我应该将connectionTimeOut设置为-1以使其无限制吗?

我正在上传的目录中的文件权限设置为777 ,我使用JDK版本7在浏览器中运行applet。

Java控制台输出:

 Java Plug-in 10.7.2.10 Using JRE version 1.7.0_07-b10 Java HotSpot(TM) Client VM 

当上传失败时,我在控制台中得到这个:

 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.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:169) at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:119) at org.apache.http.entity.mime.content.InputStreamBody.writeTo(InputStreamBody.java:70) at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:206) at org.apache.http.entity.mime.HttpMultipart.writeTo(HttpMultipart.java:224) at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:183) at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:98) at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108) at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:122) at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:271) at org.apache.http.impl.conn.ManagedClientConnectionImpl.sendRequestEntity(ManagedClientConnectionImpl.java:197) at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:257) at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1066) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1035) at com.actura.app.util.ApplicationUtil.uploadUsingApache(ApplicationUtil.java:143) at com.actura.app.util.ApplicationUtil.saveWaveToServer(ApplicationUtil.java:90) at com.actura.app.capture.RecorderUI.saveButtonActionPerformed(RecorderUI.java:1856) at com.actura.app.capture.RecorderUI.access$17(RecorderUI.java:1824) at com.actura.app.capture.RecorderUI$7.actionPerformed(RecorderUI.java:1325) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 

我已经知道这可能是我的ISP的一个问题。 我只是想知道是不是iSP的问题为什么我可以顺利使用像temviewer和Skype这样的软件?

以下是执行上载的代码:

 public static String uploadUsingApache(URL url, List list, String userId, String accountId, String waveDuration) throws Exception { // The execution: DefaultHttpClient httpclient = new DefaultHttpClient(); HttpPost method = new HttpPost(url.toString()); MultipartEntity entity = new MultipartEntity(); entity.addPart("userId", new StringBody(userId, Charset .forName("UTF-8"))); entity.addPart(IVR_ACCOUNT_KEY, new StringBody(accountId, Charset .forName("UTF-8"))); entity.addPart(IVR_MP3LEN_KEY, new StringBody(waveDuration, Charset .forName("UTF-8"))); // FileBody fileBody = new FileBody(list.get(0)); // entity.addPart("file", fileBody); for (File f : list) { byte[] imageBytes = fileToByteArray(f); entity.addPart("attachment_field", new InputStreamKnownSizeBody( new ByteArrayInputStream(imageBytes), imageBytes.length, "audio/wav", f.getName())); method.setEntity(entity); } ResponseHandler responseHandler = new BasicResponseHandler(); // HttpResponse response = httpclient.execute(method,responseHandler); String responseText = httpclient.execute(method, responseHandler); // error text if (responseText.contains("")) { responseText = responseText.replace("", ""); responseText = responseText.replace("", ""); throw new Exception(responseText); } // System.out.println(" Status " +response.getStatusLine()); List deleteList = Arrays.asList(responseText.split(",")); StringBuffer sb = new StringBuffer(); int cnt = 1; for (File f : list) { if (deleteList.contains(f.getName())) { sb.append(f.getName() + (cnt == deleteList.size() ? "" : ", ")); f.delete(); cnt++; } } if (deleteList.size() > 1) { sb.append(" are "); } else if (deleteList.size() == 1) { sb.append(" is "); } else { } sb.append(" successfully saved."); return sb.toString(); } 

当我按下applet的GUI上的上传按钮时,它调用上面的方法,同时GUI冻结。 10到50秒后,服务器抛出FileUploadException 。 servlet通知applet有关exception的信息,但是在通知用户exception之前,applet会挂起四到五分钟。

如果服务器端出现问题,为什么会有这么多延迟?

这对我帮助很大: http : //blog.somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/

基本上在我的server.xml中我将它设置为:

  

从问题中运行的配置(或者您已经尝试过的)不清楚,但问题几乎是定义上传期间超出了套接字超时。

抛出错误是因为在达到相关超时之前未完全接收文件。 这与在测试中工作的东西(在本地网络上)一致,但在运行速度较慢的互联网时(特别是在上传速度时)则不一致。

查看server.xml以获取相关的定义。 您将对connectionTimeoutconnectionUploadTimeout属性的值感兴趣(如果disableUploadTimeout设置为true,则为后者)。

在没有更多邪恶问题的证据的情况下,我希望您可以通过增加连接超时来解决此问题。