Не удалось выполнить обработку запроса multipart/form-data. Время ожидания чтения
Другие вопросы о переполнении стека рассмотрели этот вопрос, но ни один из ответов не помог мне решить эту проблему.
Я пытаюсь загрузить файл от 10 кБ до 16 МБ из апплета, используя Apache HTTP Commons. Все хорошо работает в моей локальной среде.
Я получаю следующее исключение только на моем производственном сервере (Tomcat 6.0, https://www.dailyrazor.com/), независимо от размера файла:
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()
Помимо этой проблемы с загрузкой мой апплет отлично работает.
Это конфигурация сервера, как описано в моем рабочем сервере server.xml
:
<!-- 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" />
Скорость моего подключения к Интернету прекрасна (2,01 Мбит/с и 0,42 Мбит/с), поэтому это исключение оставляет меня озадаченным. Я уже установил connectionTimeOut
в 3000000, но у меня все еще есть исключение. Должен ли я установить connectionTimeOut
в -1, чтобы сделать его неограниченным?
Разрешения для файлов установлены на 777
в каталоге, из которого я загружаюсь, и я использую JDK версии 7 для запуска апплета в браузере.
Выход консоли 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, почему я могу плавно использовать программное обеспечение, такое как temviewer и Skype?
Ниже приведен код, который выполняет загрузку:
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();
}
Когда я нажимаю кнопку загрузки в моем графическом интерфейсе апплета, он вызывает метод выше, и в то же время графический интерфейс замерзает. Через 10-50 секунд сервер выбрасывает FileUploadException
. Сервлет уведомляет апплет об исключении, но апплет висит в течение четырех или пяти минут, прежде чем уведомлять пользователя об исключении.
Почему так много задержек, если на стороне сервера что-то не так?
Ответы
Ответ 1
Это очень помогло мне: http://blog.somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/
В основном в моем server.xml я установил его как:
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionUploadTimeout="36000000" disableUploadTimeout="false"
connectionTimeout="60000" redirectPort="8443" />
Ответ 2
Неясно, из какой конфигурации вы работаете (или что вы уже пробовали), но проблема почти по определению, что во время загрузки превышен тайм-аут сокета.
Ошибка вызывается из-за того, что файл не был полностью получен до достижения соответствующего таймаута. Это согласуется с тем, что работает в тесте (в локальной сети), но не при переходе через гораздо более медленный интернет (особенно когда речь заходит о скорости загрузки).
Посмотрите на server.xml
для соответствующего определения <Connector>
. Вас будет интересовать значение атрибутов connectionTimeout
или connectionUploadTimeout
(последнее, если для параметра disableUploadTimeout
установлено значение true).
В отсутствие доказательств более гнусных проблем, я ожидаю, что вы сможете решить эту проблему, просто увеличив время ожидания соединения.