title: Processing of multipart/form-data request failed. Read timed out
body: <p>Other questions on Stack Overflow have addressed this question, but none of the answers provided have helped me to address the issue.</p>
  
  <p>I'm trying to upload a file of anywhere between 10 kB to 16 MB from an applet using Apache HTTP Commons. Everything works fine in my local environment.</p>
  
  <p>I'm receiving the following exception only on my production server (Tomcat 6.0, <a href="https://www.dailyrazor.com/" rel="noreferrer">https://www.dailyrazor.com/</a>), regardless of file size:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>This is the debugging log of Commons IO:</p>
  
  <pre><code>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() 
  </code></pre>
  
  <p>Other than this upload issue my applet works fine.</p>
  
  <p>This is the configuration of the server as described in my production server's <code>server.xml</code> file:</p>
  
  <pre><code>&lt;!-- Define an AJP 1.3 Connector on port 8009 --&gt; &lt;Connector address="127.0.0.1" port="9609" enableLookups="false" protocol="AJP/1.3" connectionTimeout="30000" maxThreads="50" minSpareThreads="1" maxSpareThreads="3" disableUploadTimeout="true" /&gt; 
  </code></pre>
  
  <p>The speed of my internet connection is fine (2.01 Mbps down and 0.42 Mbps up), so this exception leaves me puzzled. I've already set <code>connectionTimeOut</code> to 3000000, but I still got the exception. Should I set <code>connectionTimeOut</code> to -1 to make it unlimited?</p>
  
  <p>File permissions are set to <code>777</code> on the directory from which I'm uploading and I'm using JDK version 7 to run the applet in the browser.</p>
  
  <p>Java console output:</p>
  
  <pre><code>Java Plug-in 10.7.2.10
  Using JRE version 1.7.0_07-b10 Java HotSpot(TM) Client VM
  </code></pre>
  
  <p>When the upload fails, I get this in the console:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p><strong>i have come to know that this might be a problem of my ISP. I just wonder if it is the problem of iSP why i can smoothly uses software like temviewer and Skype ??</strong></p>
  
  <p>The following is the code that performs the upload:</p>
  
  <pre><code>public static String uploadUsingApache(URL url, List&lt;File&gt; 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&lt;String&gt; responseHandler = new BasicResponseHandler();
  
          // HttpResponse response = httpclient.execute(method,responseHandler);
          String responseText = httpclient.execute(method, responseHandler);
  
          // error text
          if (responseText.contains("&lt;exception&gt;")) {
              responseText = responseText.replace("&lt;exception&gt;", "");
              responseText = responseText.replace("&lt;/exception&gt;", "");
              throw new Exception(responseText);
          }
  
          // System.out.println(" Status " +response.getStatusLine());
          List&lt;String&gt; 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() &gt; 1) {
              sb.append(" are ");
          } else if (deleteList.size() == 1) {
              sb.append(" is ");
          } else {
  
          }
  
          sb.append(" successfully saved.");
  
          return sb.toString();
      }
  </code></pre>
  
  <p>When I press the upload button on my applet's GUI, it calls above method and at the same time the GUI freezes. 10 to 50 seconds later, the server throws the <code>FileUploadException</code>. The servlet notifies the applet about the exception, but the applet hangs for four or five minutes before notifying the user of the exception.</p>
  
  <p>Why is there so much delay if there's something wrong on the server side?</p>