본문 바로가기
Java, JSP

[JSP] enctype 속성의 multipart/form-data, 파일과 이미지 업로드

by LasBe 2022. 2. 23.
반응형

⚡️multipart/form-data


multipart/form-data는 fom에서 사용되는 enctype 속성의 값중 하나입니다.

 

주로 파일이나 이미지의 업로드가 필요할 때 사용됩니다.

 

 

 

⚡️enctype 속성


우선 multitype에 대해 알아보기 전에 enctype 속성에 대해 알아보겠습니다.

 

enctype 타입은 폼 데이터를 서버로 보낼 때 해당 데이터가 인코딩 되는 방법을 명시합니다.

 

이 속성은 주소창에 쿼리스트링(QueryString)을 더하는 GET 방식에는 사용이 불가능하고,

오직 form의 메소드가 POST 방식이어야만 사용 가능합니다.

 

enctytpe 속성값으로는 다음과 같이 3가지가 존재합니다.

 

1) application/x-www-form-urlencoded

POST 방식을 사용할 때 enctype를 따로 지정하지 않을 때, default 값으로 설정되는 속성입니다.

모든 문자들을 서버로 보내기 전에 인코딩됨을 명시합니다.

 

2) text/plain

공백 문자를 "+" 기호로 변환하고, 나머지 문자는 인코딩하지 않습니다.

 

3) multipart/form-data

모든 문자를 인코딩하지 않습니다.

 

 

 

⚡️getParameter()


form에서 POST 방식으로 enctype 속성을 선언하지 않아도

GET 방식처럼 request.getParameter()를 이용해 데이터를 받아올 수 있습니다.

 

이는 POST 방식 사용 시 디폴트 값이 application/x-www-form-urlencoded로 설정되어

인코딩이 이루어지면서 WAS에서 스스로 인식하고 in / output 방식으로 데이터를 처리하기 때문입니다.

 

POST 방식으로 알아서 데이터를 처리하는 것은 좋은데 한글을 전송하고 받아보면 깨지는 현상을 발견됩니다.

 

주로 사용하는 UTF-8 방식이 아니라 ISO-8859-1 방식으로 인코딩이 이루어져서 그렇습니다.

 

이 문제는 데이터를 받는 쪽에서

request.setCharacterEncoding("UTF-8") 을 이용해 한번 더 처리해주면 간단히 해결됩니다.

 

그렇다면 multipart/form-data를 이용했다면 request로 데이터를 받을 수 있을까요?

 

정답은 불가능합니다.

 

form에서 이미지와 텍스트를 보낸다고 한다면 Content-type이

이미지는 image/jpeg 

텍스트는 application/x-www-form-urlencoded가 되기 때문입니다.

 

그렇기 때문에 두 종류의 타입을 구분해줄 방법이 필요한데 이 때 MultipartRequest 객체가 사용됩니다.

 

 

 

⚡️MultipartRequest


1. 객체 생성

MultipartRequest multi = new MultipartRequest(
                		request, 
                    		savePath, 
                        	sizeLimit, 	
                        	"utf-8", 
                        	new DefaultFileRenamePolicy());

 

객체 생성자의 파라미터는 다음과 같습니다.

 

파라미터 설명
request request 객체
savePath 저장될 서버의 경로
sizeLimit 파일의 최대 크기
"utf-8" 인코딩 방식
new DefaultFileRenamePolicy() 중복 파일명 처리 정책

 

sizeLimit는 파일의 크기 제한을 1MB로 제한한다면  1 * 1024 * 1024 와 같이 표현할 수 있습니다.

 

 

2. method

1) getContentType("name")

name에 해당하는 파일의 형태가 무엇인지를 리턴합니다.

 

2) getOriginalFileName("name")

바뀌기 전 파일의 이름을 리턴합니다.

 

3) getFilesystemName("name")

업로드된 파일의 이름을 리턴합니다.

 

4) getFile("name")

업로드한 파일의 객체를 리턴합니다.

 

5) getFileNames()

파일 형태 인풋데이터의 name을 Enumeration 객체로 리턴합니다.

일반 반복자 처리하듯이 name을 뽑아낼 수 있습니다.

 

6) getParameter()

multipart/form-data로 넘겨준 파라미터를 받아옵니다.

만약 request.getParameter를 사용한다면 null 값을 반환합니다.

 

반응형

댓글


오픈 채팅