728x90
프로필 사진 업로드 시 @RequestPart 어노테이션을 사용해서 user_id와 file을 파라미터로 설정했다.
그런데 프론트에서 요청을 하든 포스트맨으로 요청을 하든 form-data로 요청을 잘 했는데도
415 Media type error가 자꾸만 떠서 어제 몇 시간 동안 삽질을 했다.
1. 에러 코드
{
"timestamp": "2024-11-25T18:12:39.762+00:00",
"status": 415,
"error": "Unsupported Media Type",
"path": "/api/profile"
}
2. 기존 코드
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/profile")
public class ProfileController {
private final ProfileService profileService;
@PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Object> uploadProfile(
@RequestPart(value = "user_id") Long user_id,
@RequestPart(value = "file", required = false) MultipartFile file
) {
try {
ProfileDTO.Response response = profileService.uploadProfile(user_id, file);
return ResponseEntity.status(HttpStatus.OK).body(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
}
기존에는 user_id 값을 Long으로 받아왔다.
3. 해결방법
찾아보니 FormData에 넣는 모든 값은 string으로 변환이 된다고 한다.
어제 몇 시간을 허비한 게 무색할 정도였다..
유저 id 값을 String으로 받아오고, Long으로 parse 해주니 요청에 성공했다.
4. 수정한 코드 및 정리
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/profile")
public class ProfileController {
private final ProfileService profileService;
@PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Object> uploadProfile(
@RequestPart(value = "user_id") String userId,
@RequestPart(value = "file", required = false) MultipartFile file
) {
try {
Long user_id = Long.parseLong(userId);
ProfileDTO.Response response = profileService.uploadProfile(user_id, file);
return ResponseEntity.status(HttpStatus.OK).body(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
}
multipart/form-data, form-data를 사용할 때는 값이 문자열로 담긴다는 점 명심하자.
참고
FormData 사용법 & 응용 총정리 (+fetch 전송)
728x90