4

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()?

4
  • 1
    Close the connection after getting response. fos.close(); Commented Nov 28, 2013 at 9:57
  • Do you mean the FileOutputStream? You really can ignore this, it is just to write to a temp file. Commented Nov 28, 2013 at 10:02
  • Oops sorry..... can you create a instance of input stream and pass it on to addBinaryBody method and once you receive the response close the connection using the instance Commented Nov 28, 2013 at 10:29
  • I tried it (see my updated code), but nothing changes Commented Nov 28, 2013 at 10:44

1 Answer 1

3

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.

Sign up to request clarification or add additional context in comments.

3 Comments

I know the content length (this inputstream is a filestream), can force it?
I solved extending org.apache.http.entity.mime.content.InputStreamBody changing public long getContentLength() method. Thank you.
any solution other than extending InputStreamBody ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.