How to upload Files in Spring Boot via REST API

In this example, we will show you how to upload both single and multiple files in Spring Boot by using the MultipartFile interface of Spring Framework.

The MultipartFile interface is basically used to handle file uploads in Spring based Applications. MultipartFile represents an uploaded file in a multipart request. A multipart request is basically a HTTP request usually constructed by a browser to transfer data and files to the server.

We assume that you already have a working Spring Boot application, if not then you can create a new Spring Boot application using the instructions provided here

Following are the sample code for uploading single file as well as multiple files in Java Spring Boot:

1. Let's create a FileInfo.java Java class with two String fields as shown in the example below:


public class FileInfo {

    private String filename;
    private String fileLocation;

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public String getFileLocation() {
        return fileLocation;
    }

    public void setFileLocation(String fileLocation) {
        this.fileLocation = fileLocation;
    }

}

2. Next, create a service interface FileService.java with two methods, one for uploading a single file and another method for uploading multiple files as shown below:


import java.util.List;
import java.util.Map;
import org.springframework.web.multipart.MultipartFile;
import com.sample.model.FileInfo;

public interface FileService {

    FileInfo uploadSingleFile(MultipartFile multipartFile, Map<String, String> params);
    List<FileInfo> uploadMultipleFiles(MultipartFile[] multipleFiles, Map<String, String> params);
}

3. Create FileServiceImpl.java Java class to the two methods of FileService interface.


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.sample.model.FileInfo;
import com.sample.service.FileService;

@Service
public class FileServiceImpl implements FileService {

    private final String PATH = "/home/files-directory/";

    @Override
    public FileInfo uploadSingleFile(MultipartFile multipleFile, Map<String, String> params) {

        /* We can receive other data with multipart file */
        String firstName = params.get("firstName");
        String lastName = params.get("lastName");

        String filename = multipleFile.getOriginalFilename();

        // Replace space in filename with underscore
        filename = filename.replaceAll("\\s", "_");

        // Location to save the file
        String path = PATH + filename;

        File file = new File(path);
        try {
            if (file.createNewFile()) {
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    fos.write(multipleFile.getBytes());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileInfo fileInfo = new FileInfo();
        fileInfo.setFileLocation(path);
        fileInfo.setFilename(filename);
        return fileInfo;
    }


    @Override
    public List<FileInfo> uploadMultipleFiles(MultipartFile[] multipleFiles,
            Map<String, String> params) {

        List<FileInfo> fileInfos = new ArrayList<>();

        /* We can receive other data with multipart files. */
        String firstName = params.get("firstName");
        String lastName = params.get("lastName");

        /* multiple multipart files using for loop */
        for (MultipartFile multipleFile : multipleFiles) {
            String filename = multipleFile.getOriginalFilename();

            // Replace space in filename with underscore
            filename = filename.replaceAll("\\s", "_");

            // location to store the received files
            String path = PATH + filename;

            File file = new File(path);
            try {
                if (file.createNewFile()) {
                    try (FileOutputStream fos = new FileOutputStream(file)) {
                        fos.write(multipleFile.getBytes());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            FileInfo fileInfo = new FileInfo();
            fileInfo.setFileLocation(path);
            fileInfo.setFilename(filename);
            fileInfos.add(fileInfo);
        }
        return fileInfos;
    }

}

4. Finally, create a controller class with two REST APIs, one API to upload a single file and the other API to upload multiple files. The following code shows how to do so:


import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.sample.model.FileInfo;
import com.sample.service.FileService;

@RestController
@RequestMapping(value = "/files")
public class FileUploadController {

    @Autowired
    private FileService fileService;

    @PostMapping(value = "/upload-single-file")
    public ResponseEntity<FileInfo> uploadASingleFile(
            @RequestPart(required = false) MultipartFile multipartFile,
            @RequestParam  Map<String, String> params) {

        return ResponseEntity.ok(fileService.uploadSingleFile(multipartFile, params));

    }

    @PostMapping(value = "/upload-multiple-files")
    public ResponseEntity<List<FileInfo>> uploadMultipleFiles(
            @RequestParam  Map<String, String> params,
            @RequestPart(required = false) MultipartFile[] multipleFiles) {

        return ResponseEntity.ok(fileService.uploadMultipleFiles(multipleFiles, params));

    }

}