Handling Multipart/form-data on Spring Boot 2

Updated:
Categories: Spring
Tags: #Spring Boot

content-type이 multipart/form-data 인 HTTP Request를 Spring Boot 2에서 처리하는 방법

build.gradle에 spring-boot-starter-web 디펜던시 추가

dependencies {
	compile('org.springframework.boot:spring-boot-starter-web')
}

Maven의 경우, pom.xml 에 디펜던시 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.10.RELEASE</version>
</dependency>

Controller 부분에는 다음과 같이 작성.

@RequestMapping(path = "/files", method = RequestMethod.POST,
        consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public @ResponseBody ResponseEntity<String> add(@RequestParam("file") MultipartFile file) {
    System.out.println(file.getOriginalFilename());
    return new ResponseEntity<>("Created", HttpStatus.OK);
}

File 외에 다른 파라미터들이 함께 있을 때

1번: 아래 코드와 같이 Request path 와 매핑되는 함수의 입력 파라미터를 추가

@RequestMapping(path = "/files", method = RequestMethod.POST,
        consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public @ResponseBody ResponseEntity<String> add(
        @RequestParam("file") MultipartFile file,
        @RequestParam("name") String name, @RequestParam("brand") String brand) {
    System.out.println(file.getOriginalFilename() + "\n" + name + "\n" + brand);
    return new ResponseEntity<>("Created", HttpStatus.OK);
}
Swagger UI

2번: 많은 입력 파라미터들이 있을 때는 Model Class를 만들고, @ModelAttribute annotation을 사용.

// lombok annotation 사용. 직접 Getter, Setter 만들어도 됨.
@Getter @Setter
public class MultiPartsRequestPayload {
    private String name;
    private String brand;
    private MultipartFile file;
}

@RequestMapping(path = "/files", method = RequestMethod.POST,
        consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public @ResponseBody ResponseEntity<String> add(
        @ModelAttribute("multiPartsRequestPayload") MultiPartsRequestPayload multiPartsRequestPayload
        ) {
    System.out.println(multiPartsRequestPayload.getFile().getOriginalFilename() + "\n" + multiPartsRequestPayload.getName() + "\n" + multiPartsRequestPayload.getBrand());
    return new ResponseEntity<>("Created", HttpStatus.OK);
}

두번째 경우에는 Controller 함수의 입력 파라미터들을 각각 관리하지 않고, Model Class 에서 validation 설정을 할 수 있다는 장점이 있음. 대신 Swagger ui(springfox-swagger-ui:2.9.2) 상에서 file을 제대로 선택할 수 없는 이슈가 존재.

Swagger UI에서 file 선택 불가

참조

Comments