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:
<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector address="127.0.0.1" port="9609" enableLookups="false" protocol="AJP/1.3" connectionTimeout="30000" maxThreads="50" minSpareThreads="1" maxSpareThreads="3" disableUploadTimeout="true" />
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<File> 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<String> responseHandler = new BasicResponseHandler(); // HttpResponse response = httpclient.execute(method,responseHandler); String responseText = httpclient.execute(method, responseHandler); // error text if (responseText.contains("<exception>")) { responseText = responseText.replace("<exception>", ""); responseText = responseText.replace("</exception>", ""); throw new Exception(responseText); } // System.out.println(" Status " +response.getStatusLine()); List<String> 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?
This helped me out a lot: http://blog.somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/
Basically in my server.xml I set it as:
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionUploadTimeout="36000000" disableUploadTimeout="false" connectionTimeout="60000" redirectPort="8443" />
It's not clear from the question what config you're running with (or what you've already tried), but the problem is almost by definition that the socket timeout is exceeded during the upload.
The error is thrown because the file was not fully received before the relevant timeout was reached. This is consistent with things working in test (on a local network) but not when running over the much slower internet (especially when it comes to upload speeds).
Have a look at your server.xml
for the relevant <Connector>
definition. You'll be interested in the value of either the connectionTimeout
or connectionUploadTimeout
attributes (the latter if disableUploadTimeout
is set to true).
In the absence of evidence of more nefarious problems, I expect you can resolve this issue simply by increasing the connection timeout(s).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With