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" />