Search code examples
javaspringspring-bootarraylistmultipart

Trying to upload files, difficulties with arrays


I'm trying to upload files, but the Multipartfiles are not getting passed on properly.

Here is my controller where I'm trying to add some files. Only the @RequestParam gets returned, Arrays.asList(files) returns an empty array. I'll add the result of the print lines below.

@Transactional
    @RequestMapping(path = "/profile/files", method=RequestMethod.POST)
    @ApiResponses(value = {
            @ApiResponse(code = HttpServletResponse.SC_BAD_REQUEST, message = "Wrong file type", response = ErrorResponse.class),
            @ApiResponse(code = HttpServletResponse.SC_FORBIDDEN, message = "Not authorized", response = ErrorResponse.class),
            @ApiResponse(code = HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message = "Internal Error", response = InternalErrorResponse.class)
    })
    @ResponseBody
    @ApiOperation(
            value = "Add files",
            tags = "Users"
    )
    public List<FileDto> addProfilePicture(@RequestParam("file") MultipartFile[] files) {
        System.out.println("Controller: Files from params: " + files.toString());
        List<MultipartFile> filesToAdd = Arrays.asList(files);
        System.out.println("Controller: Files Array.asList: " + filesToAdd);
        List<File> savedFiles = userService.addFiles(filesToAdd);
        System.out.println("Controller: Files returned from addFiles(): " + savedFiles);
        return savedFiles.stream().map(FileDto::new).collect(Collectors.toList());
    }

This is the service part:

public List<File> addFiles(List<MultipartFile> files) {

        System.out.println("Service: Input files: " + files);

        List<File> savedFiles = new ArrayList<>();

        for(MultipartFile file: files){
            File savedFile = fileService.save(file, FileService.LOCATION_DOCUMENT_FILE, S3Adapter.ACL_OWNER_ONLY);
            savedFiles.add(savedFile);
        }
        System.out.println("Service: Saved files: " + savedFiles);
        return savedFiles;
    }

This is what the print lines are producing for me when trying to upload images through Postman:

Controller: Files from params: [Lorg.springframework.web.multipart.MultipartFile;@794108b7
Controller: Files Array.asList: []
Service: Input files: []
Service: Saved files: []
Controller: Files returned from addFiles(): []

Solution

  • Looks like while you are uploading from POSTMAN, you are using binary option. This option only works if you are receiving as HttpServletRequest / MultipartRequest.

    To receive the files as @RequestParam("files") you need to use form-data option and give the key as files and for value choose file from the dropdown, choose multiple files and submit the request. It will work fine.

    Screen Shot for your reference