파일과 DTO 함께 올리기 에 관련된 연장선

Controller

Untitled

Untitled


DTO

Untitled


axios

const formData = new FormData();
    e.preventDefault();
    const data = {
      userSeq,
      categorySeq: parseInt(categorySeq),
      nickname,
      introduction: introduction.value,
    };
    formData.append("file", imgFile);
		//formData.append("request", JSON.stringify(data));
    formData.append("request", new Blob([data]), { type: "application/json" });
    axios
      .post("<http://localhost:8082/character>", formData, {
        headers: {
          //"Content-Type": false,
          //"Content-Type": "multipart/form-data",
        },
      })

시도

Untitled

Untitled

Untitled


시도해본것

  1. Spring에 consumes = {"multipart/form-data"} 추가 및 axios 의 헤더에 multipart/form-data 추가
  2. @RequestPart 로 파일, DTO를 나누지 않고 하나의 DTO로 묶어 Spring에서@ModelAttribute 하나로 받기
  3. DTO만 param 으로 보내고 Spring 에서 @RequestParam 으로 받기
  4. DTO binary 로 변환하여 보내기, JSON 으로 보내기
  5. Jackson Databind MAVEN 추가

여기가 제일 비슷한것 같은데 안된다

https://medium.com/jaehoon-techblog/simpleblog-개발-일지-4-55a8d2a8604

https://gaemi606.tistory.com/entry/Spring-Boot-multipartform-data-파일-업로드-React-Axios-REST-API?category=745027


해결

backend

@RequestPart(value="file", required = false) MultipartFile[] file,
@RequestPart(value="request") SendCharacterCreateRequest request

frontend

  1. request로 보낼 FormData를 선언해준다

    Untitled

  2. DTO 도 보내야 한다면 JSON 파일도 선언해준다

    Untitled

  3. FormData.append(key, value) 형식으로 FormData 에 데이터를 담아준다

    DTO 처럼JSON 데이터같은 경우는 binary file 로 변환해야 하기 때문에 new Blob 로 선언해야 한다. binary file 로 변환하며 타입을 내부에 명시해줘야한다.

    Untitled

  4. 보낼때는 일반 axios 를 전송하듯 보내면 된다

const formData = new FormData();    // 1번
const request = {                   // 2번
  userSeq,
  nickname: nickname.value,
};
formData.append("file", imgFile);   // 3번
formData.append("request", new Blob([JSON.stringify(request)], { type: "application/json" }));

File.post("/character", formData)   // 4번
  .then((res) => {
    if (res.status == 200) alert("캐릭터 생성이 완료되었습니다.");
		else alert("캐릭터 생성에 실패했습니다.");
})

추가적으로 알게된것

LOB

BLOB(Binary Large Object)

CLOB(Character Large Object)