2012-09-18 10 views
16

Altre domande su Stack Overflow hanno risposto a questa domanda, ma nessuna delle risposte fornite mi ha aiutato a risolvere il problema.L'elaborazione della richiesta multipart/form-data non è riuscita. Read time out

Sto tentando di caricare un file da qualsiasi parte tra 10 kB e 16 MB da un'applet utilizzando Apache HTTP Commons. Tutto funziona bene nel mio ambiente locale.

sto ricevendo la seguente eccezione solo sul mio server di produzione (Tomcat 6.0, https://www.dailyrazor.com/), indipendentemente dalle dimensioni del file:

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) 

Questo è il registro di debug dei Comuni 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() 

Oltre a questo problema di caricamento, l'applet funziona correttamente.

Questa è la configurazione del server, come descritto nella server.xml di file del mio server di produzione:

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

La velocità della mia connessione a Internet è bene (2.01 Mbps verso il basso e 0,42 Mbps in su), quindi questa eccezione mi lascia perplesso. Ho già impostato connectionTimeOut su 3000000, ma ho comunque ottenuto l'eccezione. Devo impostare connectionTimeOut su -1 per renderlo illimitato?

Le autorizzazioni file sono impostate su 777 nella directory da cui sto caricando e sto utilizzando JDK versione 7 per eseguire l'applet nel browser.

Java output della console:

Java Plug-in 10.7.2.10 
Using JRE version 1.7.0_07-b10 Java HotSpot(TM) Client VM 

Quando il caricamento non riesce, ottengo questo nella 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) 

sono venuto a sapere che questo potrebbe essere un problema del mio ISP. Mi chiedo solo se è il problema dell'iSP perché posso usare senza problemi software come temviewer e Skype ??

Il seguente è il codice che esegue l'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(); 
    } 

Quando si preme il pulsante di caricamento sul GUI del mio applet, si chiama metodo di cui sopra e, allo stesso tempo si blocca GUI. 10 a 50 secondi dopo, il server lancia il FileUploadException. Il servlet notifica all'applet l'eccezione, ma l'applet si blocca per quattro o cinque minuti prima di avvisare l'utente dell'eccezione.

Perché c'è così tanto ritardo se c'è qualcosa di sbagliato sul lato server?

+1

Sarebbe utile se si è collegato alla domanda (s) simile che si' d già visto pubblicato, in particolare se si dettagliano i passaggi che si sono già tentati, perché non funzionano per voi e in che modo il proprio ambiente è diverso da quelli in cui la soluzione ha funzionato. –

+0

Quale versione di Java stai eseguendo l'applet nel browser? L'applet si carica e funziona bene oltre a questa funzionalità di caricamento? –

+0

sì, sto usando Jdk 7 per l'applet in esecuzione. l'applet funziona bene oltre a questa funzionalità di caricamento. c'è qualche problema con la velocità di upload ?? – Mihir

risposta

27

Questo mi ha aiutato molto: http://blog.somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/

Fondamentalmente nel mio server.xml ho impostato come:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" 
     connectionUploadTimeout="36000000" disableUploadTimeout="false" 
     connectionTimeout="60000" redirectPort="8443" /> 
+0

[connectionUploadTimeout]: specifica il timeout, in millisecondi, da utilizzare mentre è in corso il caricamento di un dato. Questo ha effetto solo se disableUploadTimeout è impostato su false. [disableUploadTimeout]: questo flag consente al contenitore servlet di utilizzare un timeout di connessione diverso, generalmente più lungo durante il caricamento dei dati. Se non specificato, questo attributo è impostato su true che disabilita questo timeout più lungo. [fonte]: https://tomcat.apache.org/tomcat-7.0-doc/config/http.html –

4

Non è chiaro dalla domanda su quale configurazione si sta eseguendo (o cosa si è già provato), ma il problema è quasi per definizione che il timeout del socket viene superato durante il caricamento.

L'errore viene generato perché il file non è stato ricevuto completamente prima del raggiungimento del timeout rilevante. Questo è coerente con le cose che funzionano in test (su una rete locale) ma non quando si esegue su Internet molto più lento (specialmente quando si tratta di velocità di upload).

Dai un'occhiata al tuo server.xml per la relativa definizione <Connector>. Sarai interessato al valore degli attributi connectionTimeout o connectionUploadTimeout (quest'ultimo se disableUploadTimeout è impostato su true).

In assenza di prove di problemi più nefasti, mi aspetto che sia possibile risolvere questo problema semplicemente aumentando il timeout della connessione.

+0

questo è l'xml che ho copiato dal server.xml del mio server di produzione. Mihir

+0

anche la mia velocità internet è molto buona, non capisco qual è il problema quando si tratta di server di produzione, dovrei rendere connectionTimeOut a -1 per renderlo illimitato ?? – Mihir

+0

Ho appena controllato la mia velocità con speedtest.com e il risultato è una velocità di download di 2,01 Mbps e la velocità di upload è di 0,42 Mbps. Ho impostato la connessione Timeout su 3000000 ma la stessa eccezione. Come posso liberarmi di questo ? – Mihir

Problemi correlati