Spring -upload

Shaun·2022년 11월 13일
1

SpringBoot

목록 보기
14/21
post-thumbnail

파일 업로드

파일을 업로드 하려면 파일은 문자가 아닌 바이너리 데이터로 전송해야 한다. 문자와 바이너리를 동시에 전송하는게 일반적 이다.

Multipart/form-data

  • 다른 종류의 여러 파일과 폼의 내용을 함께 전송할 수 있다.

  • 각각 part들은 헤더와 바디값을 따로따로 갖는다.

  • Content-Disposition이라는 항목별 헤더가 추가 되있고 여기 에 부가 정보가 있다.
    Content-Dispoisition이란?

서블릿 파일 업로드

  • 각각 들어온 part들을 서버에서는 어떻게 받는지 알아보자

  • parts = multipart 로 오는 부분들을 받을수 있다

  • 물론 사이즈 제한도 가능

  • 서블릿 멀티파트 처리시 반드시 적용해야하는 옵션 , 위 사진처럼 false로 끄면 서블릿 컨테이너가 멀티파트 처리를 하지않아 request.getParmeter(), request.getParts() 두값이 Null 로 나옴

  • true = DispatcherServlet -> MultipartResolver 실행, MultipartResolver는 서블릿컨테이너가 전달하는 일반 HttpServletRequest 를 MultipartHttpServletRequest 로 변환 시켜 반환한다.
  • MultipartResolver 는 MultipartHttpServletRequest인터페이스를 구현한 StandardMultipartHttpServletRequest 반환, 하지만 이후에 배우는 MultipartFile을 주로 사용함

서블릿 파일업로드V2

  • properties에 경로 설정

  • @Value로 properties 값 사용

  • 파일들이 여러개 들어오면(parts) 각각 파트별로 헤더값 추출과정, 그리 어렵지 않다.

  • submittedFileName : 클라이언트가 전달한 파일이름

  • size : 파일 사이즈

  • Stream 으로 바이너리 데이터를 읽어 String으로 변환, 반드시 charset 지정해야함!

  • wirte(경로) 로 저장

  • 이렇게 다양한 메서드를 제공한다. 사용법은 어렵지 않다.

여기서는 그냥 이름으로 저장했지만 저장할때는 반드시 경로+랜덤이름(ex:UUID) 해야한다. 다른 클라이언트가 똑같은 이름으로 저장을 했을경우 덮어씌워질수 있기 때문에

스프링 파일 업로드

  • 서블릿이 제공하는 part도 편리 하긴 하지만 코드양도 너무많고 불편한점이 많다. 스프링에서는 파일업로드를 어떻게 처리했는지 살펴보자.

  • 스프링에서는 MultipartFile 을 제공한다. 다양한 메서드를 제공하며 사용법은 매우 쉽다.

파일업로드 예제

  • 도메인

  • 파일정보 보관
  • 클라이언트가 업로드한 파일명/서버에 저장하는 이름(랜덤값)

  • 레포지토리

  • 파일업로드가 실행되면 파일생성자를 추출하고 랜덤이름 값과 함께 조합해 서버에 저장한다.(ex:qw2-safc3-3q32.jpg)

Controller

  • 데이터들을 저장하고 그 데이터들 뷰단으로 리다이렉트 하는 부분, 사실상 실무에서는 파일같은 경우는 스토리지에 따로 저장하고 경로만 DB에 저장함

  • UrlResource: 이미지를 조회할 때 사용한다. 경로에 있는 이미지 파일을 읽어서 @ResponseBody 로 이미지 바이너리를 반환

  • 다운로드 할경우 똑같이 UrlResource를 활용해 다운로드 경로를 알려주며 그것을 ResponseEntity의 body에 넣어서 리턴해준다

  • header에 반드시 contentDisposition 값이 있어야함, 브라우저가 이값을 읽고 다운로드 함

=> 보통 httpHeader값엔 body에 대한 설명이 있음, body의 타입 등등..
즉, content-Dispoisition 은 Body의 content 성질에 대한 설명, default는 inline으로 web에 전달되는 data라고 생각하면 됀다.
지금같은 특수한경우(파일업로드) 일경우에는 attachment 와 fileName을 같이 주는 경우 다운로드 받으라는 뜻.

  • 등록폼 : 다중 파일 업로드시 multiple="multiple" 옵션 추가

  • 조회: <.img> 태그로 이미지 출력
  • 업로드이름 클릭시 다운로드(controller 호출)
profile
호주쉐프에서 개발자까지..

0개의 댓글