HTML Form
전송 방식application/x-www-form-urlencoded
multipart/form-data
application/x-www-form-urlencoded
enctype
옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 Content-Type: application/x-www-form-urlencoded
를 추가한다.username=kim&age=20
와 같이 &
로 구분해서 전송한다.multipart/form-data
: 위의 문제들을 해결하기 위해 HTTP가 제공하는 전송 방식이다!
enctype="multipart/form-data"
를 지정해줘야 한다.Content-Disposition
: 항목별 헤더Content-Type
추가
multipart/form-data
는 이렇게 각각의 항목을 구분해서, 한번에 전송한다!
서블릿을 통한 파일 업로드에 대해 알아보자!
ServletUploadControllerV1
request.getParts()
: multipart/form-data
전송 방식에서 각각 나누어진 부분을 받아서 확인할 수 있다.application.properties
logging.level.org.apache.coyote.http11=debug
→ multipart/data
방식으로 전송되었다!
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
SizeLimitExceedException
)가 발생한다.max-file-size
: 파일 하나의 최대 사이즈1MB
max-request-size
: 멀티파트 요청 하나에 업로드 할 수 있는 전체 합 (여러 파일을 업로드할 수 있으므로!)10MB
spring.servlet.multipart.enabled
false
)spring.servlet.multipart.enabled=false
😃: 서블릿 컨테이너야! 멀티파트와 관련된 처리를 하지 말아줘!
결과 로그
request=org.apache.catalina.connector.RequestFacade@xxx
itemName=null
parts=[]
request.getParameter("itemName")
, request.getParts()
의 결과가 비어져 있다. true
) - 기본값spring.servlet.multipart.enabled=true
😃: 서블릿 컨테이너야! 멀티파트 데이터를 처리해줘!
결과 로그
request=org.springframework.web.multipart.support.StandardMultipartHttpServletRequest
itemName=Spring
parts=[ApplicationPart1, ApplicationPart2]
request.getParameter("itemName")
의 결과도 잘 출력되고,request.getParts()
도 요청한 두 가지 멀티파트의 부분 데이터가 포함되어 있다.HttpServletRequest
객체가RequestFacade
→ StandardMultipartHttpServletRequest
로 변했다!실제로 파일을 서버에 업로드 해보자!
실제 파일이 저장되는 경로를 지정해보자!
application.properties
file.dir=C:/Users/yeonju/study/file/
@Value("${file.dir}")
private String fileDir;
application.properties
에서 설정한 file.dir
의 값을 주입한다.Part
주요 메세드part.getSubmittedFileName()
: 클라이언트가 전달한 파일명part.getInputStream()
: Part의 전송 데이터를 읽을 수 있다.part.write(...)
: Part를 통해 전송된 데이터를 저장할 수 있다.해당 경로에 파일도 저장되었다!
이번에는 스프링을 이용해서 파일 업로드를 해보자!
스프링은 MultipartFile
이라는 인터페이스로 멀티파트 파일을 매우 편리하게 지원한다.
@RequestParam MultipartFile file
@RequestParam
을 적용하면 된다.MultipartFile
주요 메서드file.getOriginalFilename()
: 업로드 파일명file.transferTo(...)
: 파일 저장