Tobia
Tobia

Reputation: 9506

Java Apache HttpClient error uploading files

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

Answers (1)

ok2c
ok2c

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

Related Questions