학습 목표
- Multipart에 대해 이해한다.
- 웹 어플리케이션에서 파일 업로드, 다운로드 방법에 대해 이해한다.
핵심 개념
- 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 |