Reputation: 9506
I want to upload a file using HttpClient 4.3.1. I need to add to form multipart an inputstream (to control upload progress.) instead of a File object. This is my code:
byte[] dump = ...;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(SENDLOG_URL);
MultipartEntityBuilder meb = MultipartEntityBuilder.create();
meb.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// THIS WORKS!! meb.addBinaryBody("log", new File("C:\\temp.zip"), ContentType.APPLICATION_OCTET_STREAM,"log.zip");
InputStream is=new FileInputStream("C:\\temp.zip")
meb.addBinaryBody("log", is, ContentType.DEFAULT_BINARY, "log.zip");
httppost.setEntity(meb.build());
HttpResponse resp=httpclient.execute(httppost);
is.close();
Using the method MultipartEntityBuilder.addBinaryBody(Strin,File) it works, but using MultipartEntityBuilder.addBinaryBody(Strin,InputStream) it doesn't work.
The java client doesn't throw any error, but this is the answer of remote server (Apache):
HTTP/1.1 400 Bad Request [Date: Thu, 28 Nov 2013 09:46:08 GMT, Server: Apache/2.4.6 (Unix) mod_fcgid/2.3.7, Content-Length: 226, Connection: close, Content-Type: text/html; charset=iso-8859-1]
Why this strange behaviour between new File() and new FileInputStream()?
Upvotes: 4
Views: 3935
Reputation: 27538
That is all very simple. In the former case the total length of the multipart entity content can be calculated given the length of all its parts is known. Such entity can be enclosed in a request delimited by a Content-Length
header. In the latter case the total entity length cannot be determined and the request is transmitted with chunk coding. Apparently some server side scripts with limited protocol compliance cannot handle requests without a Content-Length
header.
Upvotes: 3