배경
스프링 프로젝트를 진행하다보면 텍스트 데이터 뿐만 아니라 아래와 같이 파일도 같이 요청을 받는 경우가 발생한다.
따라서 컨트롤러 클래스에서 파일이 첨부된 API 요청을 받는 방법을 정리하였다.
사용법
컨트롤러에서 요청 받기
- @<method>Mapping 애너테이션 속성 추가
- consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}
- @RequestPart 애터테이션 사용
- value: 요청의 key값
- required = false: 파일 첨뷰가 없는 경우가 있다면 추가
- MultipartFile 객체 사용: 해당 객체를 통해 파일 정보 받기
@PostMapping(
value = "/product",
consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<Void> createProduct(
@RequestPart(value = "productReq") ProductCreateRequest request,
@RequestPart(value = "files") List<MultipartFile> files
){
productService.createProduct(request, files);
return ResponseEntity.ok()
.build();
}
파일 정보 추출 방법
MultipartFile 객체의 메서드를 활용하여 정보 추출
- file.getOriginalFilename(): 파일 이름 추출
- file.getSize(): 파일 크기 추출
- file.getContentType(): 파일 타입 추출
- file.getInputStream(): 파일 추출
public String upload(MultipartFile file) {
String imageUrl = "";
String fileName = createFileName(file.getOriginalFilename());
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(file.getSize());
objectMetadata.setContentType(file.getContentType());
try (InputStream inputStream = file.getInputStream()) {
AmazonS3.putObject(new PutObjectRequest(bucket , fileName, inputStream, objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead));
imageUrl = AmazonS3.getUrl(bucket, fileName).toString();
} catch (IOException e) {
throw new IllegalArgumentException("failed to upload");
}
return imageUrl;
}
참고자료
Postman을 이용한 File, Dto 동시 Post요청
보통 Controller에서 Dto를 받을 때는 @RequestBody를 주로 사용합니다. 그리고 File을 받을 때는 MultipartFile 객체를 사용하며, @RequestParam을 사용합니다. 하지만 File과 Dto를 같이 받기 위해서는 @RequestPart라
whyeskang.com
'Spring' 카테고리의 다른 글
사용자 정의 예외(Custom exception) (0) | 2024.03.25 |
---|