Multipart Upload with HttpClient 4

1. Overview

In this tutorial, we will illustrate how to do a multipart upload operation using HttpClient 4.

We’ll use http://echo.200please.com as a test server because it’s public and it accepts most types of content.

If you want to dig deeper and learn other cool things you can do with the HttpClient – head on over to the main HttpClient tutorial.

2. Using the AddPart Method

Let’s start by looking at the MultipartEntityBuilder object to add parts to an Http entity which will then be uploaded via a POST operation.

This is a generic method to add parts to an HttpEntity representing the form.

Example 2.1. – Uploading a Form with Two Text Parts and a File

File file = new File(textFileName);
HttpPost post = new HttpPost("http://echo.200please.com");
FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY);
StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA);
StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA);
// 
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("upfile", fileBody);
builder.addPart("text1", stringBody1);
builder.addPart("text2", stringBody2);
HttpEntity entity = builder.build();
//
post.setEntity(entity);
HttpResponse response = client.execute(post);

Note that we’re instantiating the File object by also specifying the ContentType value to be used by the server.

Also, note that the addPart method has two arguments, acting like key/value pairs for the form. These are only relevant if the server-side actually expects and uses parameter names – otherwise, they’re simply ignored.

3. Using the addBinaryBody and addTextBody Methods

A more direct way to create a multipart entity is to use the addBinaryBody and AddTextBody methods. These methods work for uploading text, files, character arrays, and InputStream objects. Let’s illustrate how with simple examples.

Example 3.1. – Uploading Text and a Text File Part

HttpPost post = new HttpPost("http://echo.200please.com");
File file = new File(textFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName);
builder.addTextBody("text", message, ContentType.DEFAULT_BINARY);
// 
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Note that the FileBody and StringBody objects are not needed here.

Also important, most servers do not check the ContentType of the text body, so the addTextBody method may omit the ContentType value.

The addBinaryBody API accepts a ContentType – but it is also possible to create the entity just from a binary body and the name of the form parameter holding the file. As stated in the previous section some servers will not recognize the file if the ContentType value is not specified.

Next, we’ll add a zip file as an InputStream, while the image file will be added as File object:

Example 3.2. – Uploading aZip File, an Image File, and a Text Part

HttpPost post = new HttpPost("http://echo.200please.com");
InputStream inputStream = new FileInputStream(zipFileName);
File file = new File(imageFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();         
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody
  ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName);
builder.addBinaryBody
  ("upstream", inputStream, ContentType.create("application/zip"), zipFileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
// 
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Note that the ContentType value can be created on the fly, as is the case in the example above for the zip file.

Finally, not all servers acknowledge InputStream parts. The server we instantiated in the first line of the code recognizes InputStreams.

Let’s now look at another example where addBinaryBody is working directly with a byte array:

Example 3.3. – Uploading a Byte Array and Text

HttpPost post = new HttpPost("http://echo.200please.com");
String message = "This is a multipart post";
byte[] bytes = "binary code".getBytes(); 
// 
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName);
builder.addTextBody("text", message, ContentType.TEXT_PLAIN);
// 
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);

Notice the ContentType – which is now specifying binary data.

4. Conclusion

This article has presented the MultipartEntityBuilder as a flexible object which offers multiple API choices to create a multipart form.

The examples have also shown how to use the HttpClient to upload a HttpEntity that similar to a form entity.

The implementation of all these examples and code snippets can be found in our GitHub project – this is an Eclipse-based project, so it should be easy to import and run as it is.

Related posts:

Comparing Long Values in Java
Java Program to Check Multiplicability of Two Matrices
Các kiểu dữ liệu trong java
Java Program to Use Boruvka’s Algorithm to Find the Minimum Spanning Tree
Ép kiểu trong Java (Type casting)
Java Program to Implement Fermat Primality Test Algorithm
Java Program to Check if any Graph is Possible to be Constructed for a Given Degree Sequence
Guide to PriorityBlockingQueue in Java
Tìm hiểu cơ chế Lazy Evaluation của Stream trong Java 8
Java 9 Stream API Improvements
Java Stream Filter with Lambda Expression
Java Program to Convert a Decimal Number to Binary Number using Stacks
Apache Commons Collections MapUtils
Display Auto-Configuration Report in Spring Boot
Java Program to Implement Segment Tree
Hướng dẫn sử dụng Java Generics
Java Program to Implement Red Black Tree
Creating a Generic Array in Java
Remove All Occurrences of a Specific Value from a List
Marker Interface trong Java
How to Get a Name of a Method Being Executed?
Java Program to Find Number of Spanning Trees in a Complete Bipartite Graph
Java Program to Find kth Smallest Element by the Method of Partitioning the Array
Hướng dẫn Java Design Pattern – Intercepting Filter
Spring Security Registration – Resend Verification Email
Java Program to Find Location of a Point Placed in Three Dimensions Using K-D Trees
Java Program to Find Shortest Path Between All Vertices Using Floyd-Warshall’s Algorithm
Explain about URL and HTTPS protocol
Java Program to Implement Hamiltonian Cycle Algorithm
Java Program to Check whether Graph is a Bipartite using 2 Color Algorithm
Serialization và Deserialization trong java
Sử dụng CyclicBarrier trong Java