본문 바로가기
Spring

파일 업로드 - BindException 에러 해결, multipart

by Big Sun 2022. 8. 26.
728x90

상황은 아래와 같다. 글 등록을 하려 하는데 아래와 같은 에러가 발생했다.

 

WARN : org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors<EOL>Field error in object 'boardVO' on field 'uploadFile': rejected value [C:\Users\19431\Pictures\Camera Roll\포메라니1안.jpeg]; codes [typeMismatch.boardVO.uploadFile,typeMismatch.uploadFile,typeMismatch.org.springframework.web.multipart.MultipartFile,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [boardVO.uploadFile,uploadFile]; arguments []; default message [uploadFile]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.web.multipart.MultipartFile' for property 'uploadFile'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.web.multipart.MultipartFile' for property 'uploadFile': no matching editors or conversion strategy found]]

 

에러 내용을 보면 typeMismatch라고 하는 데 무엇이 문제인 걸까??

 

어디를 살펴봐도 문제가 없다.

 

문제는 form 태그 안에 있었다.

 

 

<form action="insertHealthBoard.do" method="post" enctype="multipart/form-data">
</form>

 

파일,이미지 업로드 할 시에 enctype = "multipart/form-data"라는 코드를 적어줘야한다.

 

그렇다면 multipart란 무엇일까??

 

multipart가 무엇인 지 알아보기 전에, 클라이언트로부터 서버까지 데이터가 전성되는 과정을 살펴보도록 하겠다.

 

클라이언트는 파일등을 서버로 전송할 때 HTTP Request 형태로 서버에 전송한다.

 

HTTP 의 구조는 아래와 같다.

 

- Request Line

- HTTP Header

- Empty LIne

- Message Body

 

여기서 Message Body에 들어가는 데이터 타입을 HTTP Header에 명시해줄 수 있다.

이 때 명시할 수 있도록 해주는 필드가 Content-type인데, 이 타입 중 하나가 multipart이다.

 

정리!

 

Http Request는 Http Body에 클라이언트가 전송하려고하는 데이터를 넣을 수 있는 데 이때 Body에 들어가는 데이터 타입을 HTTP Header에 명시해 줌으로써 서버가 타입에 따라 알맞게 처리하게 한다.

이 Body의 타입을 명시하는 Header가 Content-type이다.

 

여기서 중요한 점은 Http Request의 Body는 한 종류가 대부분이고, Content-type도 타입을 하나만 명시할 수 있다.

 

하지만, 파일 업로드할 시에 사진을 올리는 경우 사진의 설명, 사진의 파일 2가지가 들어가고 각각의 Content-type은 서로 다르다. 이때 사용하는 것이 multipart 타입이다!!

 

 

 

 

form 태그의 enctype은 3가지가 있다.

 

  •  application/x-www-form-urlencedes

default 값으로, 모든 문자들을 서버로 보내기 전에 인코딩됨을 명시한다.

  • text/plain

공백 문자는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시한다.

  • multipart/from-data

모든 문자를 인코딩하지 않음을 명시한다. 이 방식은 파일이나 이미지를 서버로 전송할 때 주로 사용한다.

728x90