commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Becke <be...@u.washington.edu>
Subject Re: (HttpClient) Posting large files using MultipartPostMethod
Date Thu, 14 Aug 2003 14:34:33 GMT
Hi Dennis,

In general you code looks fine.  My only question is how many time you 
are running though the try/catch loop.

This error leads me to believe that the server is closing the socket 
after some period of time.  Either it does not like something about the 
post or it cannot handle the size of request you are sending.  There are 
a few things I would suggest:

  - analyze the server logs to see if there is any indication why the 
post is being rejected.
  - try using a different server side component to accept the file 
upload.  I would suggest commons FileUpload 
<http://jakarta.apache.org/commons/fileupload/index.html>.  This will 
help to narrow down the problem as is has been successfully used in the 
past.  Most browsers do not conform to the multipart post 
specification(RFC 1867) very well and as such are not always a good 
indicator of how HttpClient will fare.
  - Take a look at the wire log 
<http://jakarta.apache.org/commons/httpclient/logging.html>.  This may 
offer some useful details, but be careful as it will contain all of the 
data being posted(headers and content).
  - Fiddle with the Expect header.  Try the upload with 
MultipartPostMethod.setUseExpectHeader() set to both true and false.

I hope this helps.

Mike

Dennis SELLINGER wrote:
> Hi,
> 
> I have been trying to implement a simple client to upload a file to a servlet.  The code
I use is pretty basic (summarized below).  I find that it works for files that are sufficiently
small (<128 K) but gives the following error for larger files:
> 
> 14 août 2003 10:19:55 com.vigis.designfilereplication.Replicator postReplicationRequest
> GRAVE: I/O error while executing replication post request... root cause Software caused
connection abort: socket write error
> java.net.SocketException: Software caused connection abort: 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.commons.httpclient.HttpConnection$WrappedOutputStream.write(HttpConnection.java:1344)
> 	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
> 	at java.io.BufferedOutputStream.write(Unknown Source)
> 	at org.apache.commons.httpclient.methods.multipart.FilePart.sendData(FilePart.java:300)
> 	at org.apache.commons.httpclient.methods.multipart.Part.send(Part.java:294)
> 	at org.apache.commons.httpclient.methods.multipart.Part.sendParts(Part.java:344)
> 	at org.apache.commons.httpclient.methods.MultipartPostMethod.writeRequestBody(MultipartPostMethod.java:262)
> 	at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2224)
> 	at org.apache.commons.httpclient.HttpMethodBase.processRequest(HttpMethodBase.java:2534)
> 	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1047)
> 	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:638)
> 	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:500)
> 	at com.vigis.designfilereplication.Replicator.postReplicationRequest(Replicator.java:424)
> 	at com.vigis.designfilereplication.Replicator.main(Replicator.java:170)
> 
> My client is running on Java 1.4.2 under windows xp sp1.  In the case where the post
fails, I don't think that it arrives at my server (i.e. my servlet does not start running
the getPost() method).  My server is a servlet running under tomcat 4.1.x using the com.oreilly.servlet.MultipartRequest
API to handle the upload.  This servlet has be used extensively with multipart posts originalating
from Internet Explorer, so there should be no problems with it.
> 
> Here is a cleaned up version of the code I am executing:
> 
> 		MultipartPostMethod post = new MultipartPostMethod("http://alsace/vwjserv/accept/dea93");
> 		HttpClient client = new HttpClient();
> 		client.setConnectionTimeout(5000);
> 		UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("-----","-----");
> 		client.getState().setCredentials("realm","host",credentials);
> 		post.setDoAuthentication(true);
> 		try {
> 			File archive1 = new File("c:/test.txt");
> 			post.addParameter("VIGIS_ULD00",archive1);
> 		} catch (FileNotFoundException e1) {
> 			...
> 		}
> 		post.addParameter("instant",Long.toHexString(this.instant.getTime()));
> 		int statusCode = -1;
> 		int retryCount = 0;
> 		boolean retry = true;
> 		while (retry) {
> 			try {
> 				statusCode = client.executeMethod(post);
> 				retry = false;
> 			} catch (HttpRecoverableException hrx) {
> 				...
> 			} catch (HttpException e) {
> 				...
> 			} catch (IOException e) {			
> 				...
> 			}
> 		}
> 
> I think the code is pretty clean, but I am obviously missing a parmeter or something.
Any help would be appreciated.
> 
> Thanks in advance,
> Dennis.
> 
> Dennis Sellinger
> Geotech
> France.
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-user-help@jakarta.apache.org
> 


Mime
View raw message