Spring Boot Upload Multiple Files Example
- Details
- Written by Nam Ha Minh
- Last Updated on 20 September 2020   |   Print Email
In this post, I will share some code examples demonstrating uploading multiple files in a Java web application based on Spring Boot. For getting-started tutorial, you may need to check this Spring Boot File Upload Tutorial first. Note that the uploaded files will be stored in the file system on the server side.
Suppose that we want to show a form in which the user is required to pick 3 files to be uploaded. So we add 3 file input to the form like this:
<form th:action="@{/submit}" method="post" th:object="${candidate}" enctype="multipart/form-data" > ... <div> <label>Profile Picture: </label> <input type="file" name="profilePictureFile" th:field=”*{firstName} accept="image/png, image/jpeg" required /> </div> <div> <label>Photo ID: </label> <input type="file" name="photoIdFile" th:field=”*{lastName} accept="image/png, image/jpeg" required /> </div> <div> <label>Document: </label> <input type="file" name="documentFile" required /> </div> ... </form>
Here we have 3 file input fields with different names: profilePictureFile, photoIDFile and documentFile. The profilePictureFile and photoIDFile can be only images, whereas the documentFile can be of any type. And all these 3 file inputs are required.
The form would look something like below in a web browser:
And in the data access layer, we have an entity class that looks like follows:
package net.codejava; import javax.persistence.*; @Entity @Table(name = "candidates") public class Candidate { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "profile_picture") private String profilePicture; @Column(name = "photo_id") private String photoId; @Column(name = "document") private String document; // getters & setters are not shown }
As you can see, this entity class has 3 fields to store names of the uploaded files: profilePicture, photoId and document. The actual files will be stored in the file system.
And below is code for the handler method in Spring MVC controller class:
package net.codejava; import java.io.IOException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class AppController { @Autowired private CandidateRepository candidateRepo; @PostMapping("/upload_multiple") public String handleFormSubmit(Candidate candidate, @RequestParam("profilePictureFile") MultipartFile multipartFile1, @RequestParam("photoIdFile") MultipartFile multipartFile2, @RequestParam("documentFile") MultipartFile multipartFile3) throws IOException { String profilePictureFileName = StringUtils.cleanPath(multipartFile1.getOriginalFilename()); String photoIdFileName = StringUtils.cleanPath(multipartFile2.getOriginalFilename()); String documentFileName = StringUtils.cleanPath(multipartFile3.getOriginalFilename()); candidate.setProfilePicture(profilePictureFileName); candidate.setPhotoId(photoIdFileName); candidate.setDocument(documentFileName); Candidate savedCandidate = candidateRepo.save(candidate); String uploadDir = "candidates/" + savedCandidate.getId(); FileUploadUtil.saveFile(uploadDir, profilePictureFileName, multipartFile1); FileUploadUtil.saveFile(uploadDir, photoIdFileName, multipartFile2); FileUploadUtil.saveFile(uploadDir, documentFileName, multipartFile3); return "message"; } }
As you can see, we read names of the uploaded files first – and store names in the corresponding fields of the entity class that maps to the file upload form. Then we persist the entity object to the database. And then we store the uploaded files in the file system.
Below is code of the FileUploadUtil class:
package net.codejava; import java.io.*; import java.nio.file.*; import org.springframework.web.multipart.MultipartFile; public class FileUploadUtil { public static void saveFile(String uploadDir, String fileName, MultipartFile multipartFile) throws IOException { Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } try (InputStream inputStream = multipartFile.getInputStream()) { Path filePath = uploadPath.resolve(fileName); Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException ioe) { throw new IOException("Could not save image file: " + fileName, ioe); } } }
You can use the same name for all file input elements like this:
<input type="file" name="files" accept="image/png, image/jpeg" /> ... <input type="file" name="files" accept="image/png, image/jpeg" /> ... <input type="file" name="files" />
Then you need to use an array of MultipartFile objects in the handler method as follows:
@PostMapping("/upload_multiple") public String handleFormSubmit(Candidate candidate, @RequestParam("files") MultipartFile[] multipartFiles) { ... }
Of course then you need to access the upload file in terms of array elements.
That’s some code examples showing you how to implement multiple files upload functionality in a Spring Boot application.
Related Tutorials:
Spring Boot File Upload Tutorial (Upload and Display Images)
Other Spring Boot Tutorials:
- Spring Boot Export Data to CSV Example
- Spring Boot Hello World Example
- Spring Boot automatic restart using Spring Boot DevTools
- Spring Boot Form Handling Tutorial with Spring Form Tags and JSP
- How to create a Spring Boot Web Application (Spring MVC with JSP/ThymeLeaf)
- Spring Boot - Spring Data JPA - MySQL Example
- Spring Boot Hello World RESTful Web Services Tutorial
- How to use JDBC with Spring Boot
- Spring Boot CRUD Web Application with JDBC - Thymeleaf - Oracle
- Spring Boot RESTful CRUD API Examples with MySQL database
- How to package Spring Boot application to JAR and WAR
- Spring Boot Security Authentication with JPA, Hibernate and MySQL
- Spring Data JPA Paging and Sorting Examples
- Spring Boot Error Handling Guide
Comments
Yes, it can be used to upload any kind of files, including .docs, .pdf etc.
Follow section 4. Display uploaded images in browser in this tutorial: codejava.net/.../spring-boot-file-upload-tutorial