프로젝트 정리/Naver Boost Course

파일업로드 컨셉설명

학습 목표

  1. Multipart에 대해 이해한다.
  2. 웹 어플리케이션에서 파일 업로드, 다운로드 방법에 대해 이해한다.

핵심 개념

  • Multipart
  • enctype="multipart/form-data"
  • MultipartFile

Multipart?

웹 클라이언트가 요청을 보낼 때 HTTP프로토콜의 바디 부분에 데이터를 여러 부분으로 나눠서 보내는 것입니다.

  • 보통 파일을 전송할 때 사용합니다.

 

HttpServletRequest는 파일 업로드를 지원 안 함

  • HttpServletRequest는 웹 클라이언트가 전달하는 Multipart데이터를 쉽게 처리하는 메소드를 제공하지 않습니다.
  • 서블릿에서 파일 업로드를 처리하려면 별도의 라이브러리를 사용해야 한다.
  • 대표적인 라이브러리가 아파치 재단의 commons-fileupload입니다.

 

Spring MVC에서의 파일 업로드

  • Spring MVC에서 파일을 업로드 하려면 몇 가지 라이브러리와 설정을 추가해야 합니다.
  • commons-fileupload, commons-io 라이브러리 추가
  • MultipartResolver Bean 추가

 

파일 업로드를 위한 라이브러리 추가

<!-- file upload library -->
  <dependency>
  	<groupId>commons-fileupload</groupId>
  	<artifactId>commons-fileupload</artifactId>
  	<version>1.2.1</version>
  </dependency>
  <dependency>
  	<groupId>commons-io</groupId>
  	<artifactId>commons-io</artifactId>
  	<version>1.4</version>
  </dependency>

스프링 설정 추가

  • DispathcerServlet은 준비 과정에서 "multipart/form-data"가 요청으로 올 경우 MultipartResolver를 사용합니다.
@Bean
public MultipartResolver multipartResolver() {
org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new org.springframework.web.multipart.commons.CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(10485760); // 1024 * 1024 * 10
return multipartResolver;
}

파일 업로드 폼

  • 파일 업로드 시에는 form태그에 enctype설정이 되어 있어야 합니다.
  • post 방식으로 전송해야 합니다. 
<form method="post" action="/upload"
              enctype="multipart/form-data">
......
<input type="file" name="file">
<input type="submit">
</form>

Controller에서의 업로드 처리

  • @PostMapping이 사용되야 합니다.
  • 업로드 파일이 하나일 경우 @RequestParam("file") MultipartFile file
  • 업로드 파일이 여러 개일 경우 @RequestParam("file") MultipartFile[] files
  • MultipartFile의 메소드를 이용해서 파일 이름, 파일 크기 등을 구하고 InputStream을 얻어 파일을 서버에 저장합니다.

 

Controller에서의 다운로드 처리

  • 파일 다운로드와 관련된 헤더 정보를 출력합니다.
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Length", fileLength;
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");
  • 파일을 읽어 HttpServletResponse의 OutputStream으로 출력합니다.

 

DispathcerServlet은 준비 과정에서 "multipart/form-data"가 요청으로 올 경우 MultipartResolver를 사용

type=file인 input 태그가 여러 개 있고 name 속성의 값이 같다면 배열 형태로 컨트롤러에게 전달됨

'프로젝트 정리 > Naver Boost Course' 카테고리의 다른 글

파일 다운로드 구현하기  (0) 2021.04.22
파일 업로드 구현하기  (0) 2021.04.20
slf4j를 이용한 로그남기기  (0) 2021.04.15
slf4j 설정하기  (0) 2021.04.15
로깅이란  (0) 2021.04.15