kivv00ng
네오의 개발일지
kivv00ng
전체 방문자
오늘
어제
  • 분류 전체보기 (16)
    • java (6)
    • springboot (2)
    • db (1)
    • cs (1)
      • 네트워크 (1)
    • 끄적끄적 (3)
    • 기타 (1)
    • JPA (1)
    • IT도서 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kivv00ng

네오의 개발일지

springboot

multipartForm 415 에러..

2023. 3. 11. 05:28

 

 

이미지 파일 전송을 위하여 multipartForm을 사용하였고,

이미지와 관련된 데이터들을 json 데이터와 함께 서버로 post 요청 하였다.

하지만 .. HttpMediaTypeNotSupportedException 발생.. 뭐지??

컨텐트 타입과 관련된 415 에러였다..

 

왜 발생한것일까..? 

알아보니 byte값을 역직렬화 하는 MultipartResolver에서 스트링 값이 오니 오류가 난 것으로 추측된다.

스프링에서 @RequestPart의 역직렬화는 MultipartResolver로 진행된다.

하지만 나는 서버단에서는 @RequestPart를 사용하고, 클라이언트 단에서는 기존 http 통신을 하듯이 json을 스트링 값으로  보내서 해당 에러가 발생한 것이다.

따라서 @RequestPart 어노테이션을 그대로 쓸 것이라면, json을 blob(Binary Large Object)으로 다시 바꾸어 주면 잘 동작할 것이다.

 

 @PostMapping(value = "/api/newBook", consumes = {MediaType.APPLICATION_JSON_VALUE,
      MediaType.MULTIPART_FORM_DATA_VALUE})
  public ResponseEntity<BookResponse> createBook(@RequestPart BookAddRequest bookAddRequest,
      @RequestPart("bookImage") MultipartFile bookImage){
      
      .....
  }

이전에 사용했던 코드는 아래와 같았다.

var json = JSON.stringify({
      title: input_title,
      summary: input_summary,
      price: input_price,
      dislike: input_dislike,
      devCourse: input_devCourse,
      junior: input_junior,
      middle: input_middle
    })
formData.append("bookAddRequest", json);
formData.append("bookImage", file);

fetch("http://localhost:8080/api/newBook", {
  method: "POST",
  body: formData,
}).then(()=>{
	....
});

......

그리고 아래는 바꿔준 코드이다.

var json = JSON.stringify({
      title: input_title,
      summary: input_summary,
      price: input_price,
      dislike: input_dislike,
      devCourse: input_devCourse,
      junior: input_junior,
      middle: input_middle
    })
    
//변경된 부분
const blob = new Blob([json], {type: "application/json"});
formData.append("bookAddRequest", blob);
formData.append("bookImage", file);

fetch("http://localhost:8080/api/newBook", {
  method: "POST",
  body: formData,
}).then(()=>{
	....
});

......

 

다행히  잘 동작했다!ㅎㅎ 

출처

  • https://velog.io/@hhhminme/Axios%EC%97%90%EC%84%9C-Post-%EC%8B%9C-Contenttypeapplicationoctet-streamnotsupported-%ED%95%B8%EB%93%A4%EB%A7%81415-%EC%97%90%EB%9F%AC
  • https://developer.mozilla.org/ko/docs/Web/API/Blob
  • https://velog.io/@huewilliams/%ED%8C%8C%EC%9D%BC%EA%B3%BC-JSON-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EB%8F%99%EC%8B%9C%EC%97%90-%EB%B3%B4%EB%82%B4%EA%B8%B0-2%ED%8E%B8-feat.-React-Express-Spring
  • https://velog.io/@prayme/Spring%EC%9D%80-Http-Message-Body%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-Java%EC%9D%98-%EA%B0%9D%EC%B2%B4%EB%A1%9C-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%ED%95%A0%EA%B9%8C
  • https://velog.io/@hwan2da/Spring-RequestBody-vs-RequestParam-vs-RequestPart-vs-ModelAttribute

 

'springboot' 카테고리의 다른 글

CORS preflight와 인증 필터 오류  (0) 2023.03.20
    'springboot' 카테고리의 다른 글
    • CORS preflight와 인증 필터 오류
    kivv00ng
    kivv00ng

    티스토리툴바