Other questions on Stack Overflow have addressed this question, but none of the answers provided have helped me to address the issue.
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.
I'm receiving the following exception only on my production server (Tomcat 6.0, https://www.dailyrazor.com/), regardless of file size:
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) This is the debugging log of 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() Other than this upload issue my applet works fine.
This is the configuration of the server as described in my production server's server.xml file:
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 connectionTimeOut to 3000000, but I still got the exception. Should I set connectionTimeOut to -1 to make it unlimited?
File permissions are set to 777 on the directory from which I'm uploading and I'm using JDK version 7 to run the applet in the browser.
Java console output:
Java Plug-in 10.7.2.10 Using JRE version 1.7.0_07-b10 Java HotSpot(TM) Client VM When the upload fails, I get this in the console:
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) 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 ??
The following is the code that performs the upload:
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(); } 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 FileUploadException. The servlet notifies the applet about the exception, but the applet hangs for four or five minutes before notifying the user of the exception.
Why is there so much delay if there's something wrong on the server side?