본문 바로가기

dev/Spring

파일 업다운로드 기본설정, 멀티파트 미디어 타입

1. 멀티파트 미디어 타입


POST 방식의 전송은 POST body에 데이터를 포함시켜 전송한다. 이 때, 다음 두 가지 방식을 사용할 수 있다.

  • application/x-www-form-urlencoded : 일반 파라미터만 전송 가능
  • multipart/form-data : 파일 전송 가능

multipart 미디어 타입은 단일 body에 다중 resource로 설계된 타입이다.

이미지에서 볼 수 있듯 하나의 body에 여러 컨텐츠가 포함되며 각 컨텐츠는 boundary로 구분된다.

특히 마지막 boundary의 끝에는 --가 붙어 body의 끝을 알린다. (이는 모두 HTTP 통신 규격에 따른다.)

만약 데이터의 크기가 패킷 크기보다 크다면(1500byte), 여러 패킷으로 쪼개져서 전송된다.





2. spring MVC 파일 업다운로드 기본설정

multipart 미디어 타입을 이용해 파일을 업로드 및 다운로드 할 수 있다.

단, spring에서 multipart는 POST로만 주고받을 수 있다. (https://blog.outsider.ne.kr/1001, 멀티파트 데이터는 POST만 받도록 하드코딩 되어있다.)


1) commons-fileupload, commons-io 라이브러리 추가

  • 서블릿의 HttpServletRequest는 Multipart 데이터를 처리하는 메소드 제공 X
  • 따라서, multipart 데이터 처리를 위한 라이브러리 추가 필요
  • multipart 데이터를 편리하게 처리할 수 있는 라이브러리로 commons-fileupload, commons-io 가 있다.

<!-- commons-fileupload -->

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.2.1</version>

</dependency>


<!-- commons-io -->

<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>1.4</version>

</dependency>


2) MultipartResolver Bean추가

  • DispatcherServlet은 멀티파트 데이터를 받았을 때 MulipartResolver를 사용한다.
  • 이를 위해 MultipartResolver Bean을 컨테이너에 등록해준다.
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(MAX_SIZE);
return multipartResolver;
}

또는

 <!-- File Upload -->
    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>


3) multipart 데이터 처리 controller

  • 반드시 POST 매핑을 사용한다. (https://blog.outsider.ne.kr/1001, 멀티파트 데이터는 POST만 받도록 하드코딩 되어있다.)
  • @RequestParam을 통해 파일을 받을 수 있다.
  • 파일을 받을 때는 MultipartFile 객체를 사용한다. 이 때, 파일이 여러개라면 배열을 사용할 수 있다. ex) @RequestParam("file") MultipartFile[] files
  • MultipartFile 객체의 메소드를 통해 멀티파트 데이터를 처리할 수 있다.





[기타]
멀티파트 데이터를 보내기 위한 from 형식
  • form 의 enctype을 multipart/from-data 로 설정해 주어야 한다.
  • 반드시 post 메소드를 이용해야 한다.
  • input type은 file을 사용한다.
<form method = "post" action="/upload" enctype = "multipart/form-data">
<input type = "file" name ="upload_file"/>
</form>

[참조]

POST 방식의 데이터 전송 과정 : http://m.blog.daum.net/question0921/569?np_nil_b=-1

Multipart 요청에 대하여 : https://jangchulwoon.github.io/http/2017/09/24/Multipart/

HTTP multipart/form-data raw 데이터는 어떤 형태일까? : https://lng1982.tistory.com/209

'dev > Spring' 카테고리의 다른 글

Advice를 이용한 예외 처리  (0) 2019.03.21
spring data jpa에서 enum 사용 방법  (0) 2019.03.21
로깅, SLF4J  (0) 2019.02.24
인터셉터, 서블릿 필터  (0) 2019.02.24
상태 정보 유지(쿠키, 세션)  (0) 2019.02.20