1. Multipart란?
- 웹 클라이언트가 요청을 보낼 때, http 프로토콜의 바디 부분에 데이터를 여러 부분으로 나눠서 보내는 것.
- 웹 클라이언트가 서버에게 파일을 업로드할 때, http 프로토콜의 바디 부분에 파일정보를 담아서 전송을 하는데, 파일을 한번에 여러개 전송을 하면 body 부분에 파일이 여러개의 부분으로 연결되어 전송된다. 이렇게 여러 부분으로 나뉘어서 전송되는 것을 Multipart data라고 한다.
- 보통 파일을 전송할 때 사용한다.
2. HttpServletRequest는 파일 업로드를 지원하지 않는다.
- HttpServletRequest는 웹 클라이언트가 전달하는 Multipart 데이터를 쉽게 처리하는 메소드를 제공하지 않는다. (HttpServletRequest는 http 프로토콜의 body부분을 읽어들이는 input 스트림만을 지원, 사용자는 이런 input 스트림을 이용해서 Multipart 부분을 잘 나누어서 사용해야한다. 보통은 직접 구현하지 않고 라이브러리를 사용)
- 서블릿에서 파일 업로드를 처리하려면 별도의 라이브러리를 사용해야 한다. 대표적인 라이브러리가 아파치 재단의 commons-fileupload이다.
3. Spring MVC에서의 파일 업로드
Spring MVC에서 파일을 업로드 하려면 몇가지 라이브러리와 설정을 추가해야한다.
commons-fileupload,commons-io라이브러리 추가MultipartResolverBean 추가
4. Spring 설정 추가
- DispatcherServlet은 준비과정에서 "multipart/form-data"가 요청으로 올 경우 MultipartResolver를 사용한다.
@Bean
public MultipartResolver multipartResolver(){
org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new
org.springframework.web.multipart.commons.CommonsMultipartResolver();
multipartResolver.setMaxUplaodSize(10485760); //1024 * 1024 * 10 (최대 10MB)
return multipartResolver;
}
5. 파일 업로드 폼
- 파일 업로드 시에는 form 태그의 enctype이 "multipart/form-data"로 설정되어야 한다.
- method는 "POST"이어야 한다.
- input 태그의 type 속성 값을 "file"로 지정해야한다.
- type이 "file"인 input 태그가 여러개 있고, name 속성의 값이 같다면 파일이 배열 형태로 Controller에게 전달된다.
<form method = "post" action = "/upload" enctype = "multipart/form-data">
......
<input type = "file" name = "file">
<input type = "submit">
</form>
6. Controller에서의 업로드 처리
- @PostMapping 어노테이션을 사용한다.
- 파일 정보는 MultipartFile 타입으로 파라미터에 전달된다.
- 업로드 파일이 하나일 경우 @RequestParam("file") MultipartFile file
- 업로드 파일이 여러개일 경우 @RequestParam("file") MultipartFile[] files
- MultipartFile의 메소드를 이용해서 파일이름, 파일 크기 등을 구하고, InputStream을 얻어 파일을 서버에 저장한다.
7. Controller에서의 다운로드 처리
- 서버의 특정 디렉토리는 외부에서 접근할 수 없기 때문에, 이런 파일을 외부에서 사용할 수 있도록 하려면 다운로드 기능을 제공 해야한다.
- 파일 다운로드와 관련된 헤더 정보를 설정해준다. (파일을 다운로드하는 Controller 메소드에는 먼저, 헤더 정보에 사용자가 다운받으려는 파일 정보와 함께 캐시를 사용하지 않도록 설정해주어야 한다.)
- 파일을 읽어 HttpServletResponse의 OutputStream으로 출력
response.setHeader("Content-Disposition", "attatchment; 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;");
참조 URL
'Java > Spring' 카테고리의 다른 글
SLF4J란? (0) | 2020.07.20 |
---|---|
로깅(Logging)이란? (0) | 2020.07.20 |
Spring Security (0) | 2020.07.18 |
아큐먼트 리졸버란? (1) | 2020.07.17 |
인터셉터(Interceptor)란? (0) | 2020.07.17 |