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:

Giới thiệu SOAP UI và thực hiện test Web Service
Java Program to Implement Quick Sort Using Randomization
ThreadPoolTaskExecutor corePoolSize vs. maxPoolSize
Giới thiệu Google Guice – Aspect Oriented Programming (AOP)
Java Program to Implement Floyd Cycle Algorithm
Giới thiệu Java Service Provider Interface (SPI) – Tạo các ứng dụng Java dễ mở rộng
Exploring the New Spring Cloud Gateway
Java Program to Perform Searching Using Self-Organizing Lists
Spring MVC Async vs Spring WebFlux
Java Program to Implement Leftist Heap
Java Program to Implement Interval Tree
Getting Started with Stream Processing with Spring Cloud Data Flow
New Features in Java 10
Collect a Java Stream to an Immutable Collection
Spring Boot - Creating Docker Image
Lấy ngày giờ hiện tại trong Java
Guide to the Java ArrayList
Guide to Escaping Characters in Java RegExps
Java Program to Perform Searching Based on Locality of Reference
Java Map With Case-Insensitive Keys
Constructor Injection in Spring with Lombok
Spring WebClient and OAuth2 Support
Display Auto-Configuration Report in Spring Boot
Java Program to Generate Date Between Given Range
Form Validation with AngularJS and Spring MVC
Lập trình đa luồng trong Java (Java Multi-threading)
Java Program to Implement the MD5 Algorithm
Java Program to Implement the Binary Counting Method to Generate Subsets of a Set
Java Program to Implement AA Tree
Java Program to Check for balanced parenthesis by using Stacks
Java Program to Find ith Largest Number from a Given List Using Order-Statistic Algorithm
Java Program to Find Maximum Element in an Array using Binary Search