Uploading MultipartFile with Spring RestTemplate

1. Overview

This quick tutorial focuses on how to upload a multipart file using Spring’s RestTemplate.

We’ll see both a single file and multiple files – upload using the RestTemplate.

2. What Is an HTTP Multipart Request?

Simply put, a basic HTTP POST request body holds form data in name/value pairs.

On the other hand, HTTP clients can construct HTTP multipart requests to send text or binary files to the server; it’s mainly used for uploading files.

Another common use-case is sending the email with an attachment. Multipart file requests break a large file into smaller chunks and use boundary markers to indicate the start and end of the block.

Explore more about multipart requests here.

3. Maven Dependency

This single dependency is enough for the client application:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

4. The File Upload Server

The file server API exposes two REST endpoints for uploading single and multiple files respectively:

  • POST /fileserver/singlefileupload/
  • POST /fileserver/multiplefileupload/

5. Uploading a Single File

First, let’s see single file upload using the RestTemplate.

We need to create HttpEntitywith header and body. Set the content-type header value to MediaType.MULTIPART_FORM_DATA. When this header is set, RestTemplate automatically marshals the file data along with some metadata.

Metadata includes file name, file size, and file content type (for example text/plain):

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

Next, build the request body as an instance of LinkedMultiValueMap class. LinkedMultiValueMap wraps LinkedHashMap storing multiple values for each key in a LinkedList.

In our example, the getTestFile( ) method generates a dummy file on the fly and returns a FileSystemResource:

MultiValueMap<String, Object> body
  = new LinkedMultiValueMap<>();
body.add("file", getTestFile());

Finally, construct an HttpEntity instance that wraps the header and the body object and post it using a RestTemplate.

Note that the single file upload points to the /fileserver/singlefileupload/ endpoint.

In the end, the call restTemplate.postForEntity( ) completes the job of connecting to the given URL and sending the file to the server:

HttpEntity<MultiValueMap<String, Object>> requestEntity
 = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
  .postForEntity(serverUrl, requestEntity, String.class);

6. Uploading Multiple Files

In multiple file upload, the only change from single file upload is in constructing the body of the request.

Let’s create multiple files and add them with the same key in MultiValueMap.

Obviously, the request URL should refer to endpoint for multiple file upload:

MultiValueMap<String, Object> body
  = new LinkedMultiValueMap<>();
body.add("files", getTestFile());
body.add("files", getTestFile());
body.add("files", getTestFile());
    
HttpEntity<MultiValueMap<String, Object>> requestEntity
  = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
  .postForEntity(serverUrl, requestEntity, String.class);

It’s always possible to model single file upload using the multiple file upload.

7. Conclusion

In conclusion, we saw a case of MultipartFile transfer using Spring RestTemplate.

As always, the example client and server source code is available over on GitHub.

Related posts:

Intro to Spring Boot Starters
A Guide to Java HashMap
Java Program to Find the Connected Components of an UnDirected Graph
Receive email using POP3
Java Program to Check Whether a Directed Graph Contains a Eulerian Cycle
Java toString() Method
Introduction to Spring MVC HandlerInterceptor
Java Program to Implement Gauss Jordan Elimination
Java Program to Implement Heap Sort Using Library Functions
Java Program to Perform Sorting Using B-Tree
Converting String to Stream of chars
Các chương trình minh họa sử dụng Cấu trúc điều khiển trong Java
Spring Boot - Database Handling
Primitive Type Streams in Java 8
Entity To DTO Conversion for a Spring REST API
HttpClient Basic Authentication
An Intro to Spring Cloud Security
Java Program to Give an Implementation of the Traditional Chinese Postman Problem
Write/Read cookies using HTTP and Read a file from the internet
Java Program to find the number of occurrences of a given number using Binary Search approach
Spring Boot - OAuth2 with JWT
Getting the Size of an Iterable in Java
SOAP Web service: Upload và Download file sử dụng MTOM trong JAX-WS
SOAP Web service: Authentication trong JAX-WS
Converting Iterator to List
Java Program to Check whether Undirected Graph is Connected using BFS
Remove All Occurrences of a Specific Value from a List
Java Program to Find ith Largest Number from a Given List Using Order-Statistic Algorithm
Introduction to the Java NIO Selector
Tránh lỗi ConcurrentModificationException trong Java như thế nào?
Java Program to Find Nearest Neighbor for Static Data Set
Java Program to Compute Discrete Fourier Transform Using Naive Approach