멀티 파트 세팅
DispatcherServlet에는 멀티 파트 요청의 데이터를 파싱하기 위한 로직이 구현되어 있지 않다. 대신, 아래의 두 인터페이스로 MultipartResolver를 구현한다.
CommonsMultipartResolver : 멀티 파트 요청을 Jakarta Commons FileUpload를 사용하여 결정
StandardServletMultipartResolver : 서블릿 3.0을 사용한 멀티 파트 요청에 대한 지원(spring 3.1 이상)
1 2 3 4 5 | @Bean public MultipartResolver multipartResolver () throws IOException { return new StandardServletMultipartResolver(); } | cs |
멀티 파트에 대한 세부 설정은 아래와 같이 한다.
1 2 3 4 5 | @Override protected void customizeRegistration(Dynamic registration) { registration.setMultipartConfig(new MultipartConfigElement("/tmp/goldenDog/uploads")); // 업로드 위치 설정 } | cs |
세부 설정이 가능한 것들은 아래와 같은데, 아래의 순서와 파라메터 순서는 같다.
- 업로드되는 파일의 최대 크기(byte). 기본 설정은 제한 없음.
- 전체 멀티 파트 요청의 최대 크기(byte). 기본 설정은 제한 없음.
- 임시 저장 위치에 쓰이지 않고 업로드할 수 있는 파일의 최대 크기(byte). 기본 설정은 0 이며 모든 업로드되는 파일은 디스크에 쓰인다.
예를 들어, 업로드되는 파일의 크기를 2MB로, 전체 요청의 크기는 4MB로 제한하고, 모든 파일을 디스크에 쓰도록 하고 싶다면 아래와 같이 사용하면 된다.
1 2 3 4 5 | @Override protected void customizeRegistration(Dynamic registration) { registration.setMultipartConfig(new MultipartConfigElement("/tmp/goldenDog/uploads", 2097152, 4194304, 0)); } | cs |
XML 설정에서는 위 설정을 web.xml을 이용한다.
1 2 3 4 5 6 7 8 9 10 | <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <multipart-config> <location>/tmp/goldenDog/uploads</location> <max-file-size>2097152</max-file-size> <max-request-size>4194304</max-request-size> </multipart-config> </servlet> | cs |
멀티 파트 요청의 처리
멀티 파트 요청을 처리하기 위한 가장 일반적인 방법은 컨트롤러 메서드의 파라메터에 @RequestPart 어노테이션을 붙이는 것이다.
뷰에서는 아래와 같은 <form>이 있을 것이다.
1 2 3 | <form method="POST" action="/upload" enctype="multipart/form-data"> <input type="file" name="image" accept="image/jpeg, image/png, image/gif" /> </form> | cs |
컨트롤러에서는 다음과 같이 요청을 처리한다.
<form>이 제출되면 file 애트리뷰트에 요청 파트의 데이터를 포함한 byte 배열을 넘겨준다.
파일을 선택하지 않았다면, 배열은 비어있는 상태이며, null은 아니다.
1 2 3 4 5 | @RequestMapping(value="/upload", method=POST) public String processUpload (@RequestPart("image") byte[] file) { } | cs |
스프링에서는 MultipartFile 인터페이스를 제공해 멀티 파트 데이터를 처리하는 다기능 객체를 이용할 수 있도록 한다.
MultipartFile은 원본 파일명, 크기, 타입 등을 얻어올 수 있고, 파일 데이터를 스트림 형태로 읽어올 수도 있다.
또, transferTo() 메서드로 업로드된 파일을 파일 시스템에 쓰는 것도 돕는다.
아래는 업로드된 파일을 MultipartFile을 이용해 파일 시스템에 쓰는 코드다.
1 2 3 4 5 | @RequestMapping(value="/upload", method=POST) public String processUpload (@RequestParam("image") MultipartFile file) { file.transferTo(new File("/data/goldendog/realFiles/" + file.getOriginalFilename())); } | cs |
|
이 포스트는 스프링 인 액션을 읽고 개인적으로 필요하다고 생각되는 내용을 정리한 포스트입니다. 일부 내용, 소스코드는 스프링 인 액션의 내용일 수 있습니다. |
'🌱 SPRING > 스프링 인 액션' 카테고리의 다른 글
스프링 시큐리티 ① : 기본 설정 (0) | 2018.08.01 |
---|---|
예외 처리하기 (0) | 2018.07.31 |
자바 설정으로 Filter 등록하기 (0) | 2018.06.13 |
DispatcherServlet 설정하기 (0) | 2018.06.13 |
JSP 라이브러리 이용하기 (0) | 2018.06.13 |