파일을 업로드 하려면 파일은 문자가 아닌 바이너리 데이터로 전송해야 한다. 문자와 바이너리를 동시에 전송하는게 일반적 이다.
다른 종류의 여러 파일과 폼의 내용을 함께 전송할 수 있다.
각각 part들은 헤더와 바디값을 따로따로 갖는다.
Content-Disposition이라는 항목별 헤더가 추가 되있고 여기 에 부가 정보가 있다.
Content-Dispoisition이란?
각각 들어온 part들을 서버에서는 어떻게 받는지 알아보자
parts = multipart 로 오는 부분들을 받을수 있다
물론 사이즈 제한도 가능
서블릿 멀티파트 처리시 반드시 적용해야하는 옵션 , 위 사진처럼 false로 끄면 서블릿 컨테이너가 멀티파트 처리를 하지않아 request.getParmeter(), request.getParts() 두값이 Null 로 나옴
- true = DispatcherServlet -> MultipartResolver 실행, MultipartResolver는 서블릿컨테이너가 전달하는 일반 HttpServletRequest 를 MultipartHttpServletRequest 로 변환 시켜 반환한다.
submittedFileName : 클라이언트가 전달한 파일이름
size : 파일 사이즈
Stream 으로 바이너리 데이터를 읽어 String으로 변환, 반드시 charset 지정해야함!
wirte(경로) 로 저장
이렇게 다양한 메서드를 제공한다. 사용법은 어렵지 않다.
여기서는 그냥 이름으로 저장했지만 저장할때는 반드시 경로+랜덤이름(ex:UUID) 해야한다. 다른 클라이언트가 똑같은 이름으로 저장을 했을경우 덮어씌워질수 있기 때문에
UrlResource: 이미지를 조회할 때 사용한다. 경로에 있는 이미지 파일을 읽어서 @ResponseBody 로 이미지 바이너리를 반환
다운로드 할경우 똑같이 UrlResource를 활용해 다운로드 경로를 알려주며 그것을 ResponseEntity의 body에 넣어서 리턴해준다
header에 반드시 contentDisposition 값이 있어야함, 브라우저가 이값을 읽고 다운로드 함
=> 보통 httpHeader값엔 body에 대한 설명이 있음, body의 타입 등등..
즉, content-Dispoisition 은 Body의 content 성질에 대한 설명, default는 inline으로 web에 전달되는 data라고 생각하면 됀다.
지금같은 특수한경우(파일업로드) 일경우에는 attachment 와 fileName을 같이 주는 경우 다운로드 받으라는 뜻.