[Spring framework] fileupload, 스프링 파일 업로드
Spring에서 파일 업로드하는 방법에 대해 알아보겠습니다.
Servlet 3.0 전까지는 commons의 파일 업로드를 이용하거나 cos.jar 등을 이용했습니다. Servlet 3.0 이후(Tomcat 7.0)에는 기본적으로 업로드되는 파일을 처리할 수 있는 기능이 추가되어 추가적인 라이브러리가 필요로 하지 않습니다.
Spring Legacy Project로 생성된 프로젝트의 경우 Servlet 2.5를 기준으로 생성되기 때문에 commons-fileupload 라이브러리를 이용하여 fileupload를 사용합니다.
pom.xml에 commons-fileupload 라이브러리 추가
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
파일을 업로드할 폴더를 C 드라이브 아래에 생성합니다. 폴더 이름은 원하시는 것으로 하면 됩니다.
servlet-conext.xml 설정
servlet-context.xml은 스프링 MVC의 특정한 객체(빈)를 설정해서 파일을 처리합니다. 다른 객체(Bean)를 설정하는 것과 달리 파일 업로드의 경우엔 반드시 id 속성의 값을 'multipartResolver'로 정확하게 지정해야 합니다.
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf-8"></beans:property>
<!-- 1024 * 1024 * 10 bytes 10MB -->
<beans:property name="maxUploadSize" value="104857560"></beans:property>
<!-- 1024 * 1024 * 2 bytes 2MB -->
<beans:property name="maxUploadSizePerFile" value="2097152"></beans:property>
<beans:property name="uploadTempDir" value="file:/C:/ftmp"></beans:property>
<beans:property name="maxInMemorySize" value="10485756"></beans:property>
</beans:bean>
maxUploadSize는 한 번의 Request로 전달될 수 있는 최대의 크기
maxUploadSizePerFile은 하나의 파일 최대 크기
maxInMemorySize는 메모리상에서 유지하는 최대의 크기를 의미합니다.
만일 이 크기 이상의 데이터는 uploadTempDir에 임시 파일의 형태로 보관됩니다.
uploadTempDir에서 절대 경로를 이용하려면 URL형태로 제공해야 하기 때문에 'file:/' 로 시작하도록 합니다.
defaultEncoding은 업로드하는 파일의 이름이 한글일 경우 깨지는 문제를 처리합니다.
SampleController에는 get 방식으로 파일을 업로드할 화면을 처리합니다.
화면 작성 : exUpload.jsp
여러 파일을 한꺼번에 업로드하는 예제로 작성되었습니다. <form> 태그의 action 값이 "/sample/exUploadPost"로 작성되었으므로 이에 맞는 메서드를 SampleController에 추가합니다.
@PostMapping("/exUploadPost")
public String exUploadPost(MultipartFile[] files) { // ArrayList<MultipartFile>
String uploadFolder = "C:\\ftmp\\storage";
for(MultipartFile file : files) {
log.info("---------------------");
log.info("name : " + file.getOriginalFilename());
log.info("size : " + file.getSize());
File saveFile = new File(uploadFolder, file.getOriginalFilename());
try {
file.transferTo(saveFile);
} catch (IllegalStateException e) {
log.info(e.getMessage());
} catch (IOException e) {
log.info(e.getMessage());
}
}
return "forward:/sample/exUpload"; // "redirect:/sample/exUpload";
}
스프링 MVC는 전달되는 파라미터가 동일한 이름으로 여러 개 존재하면 배열로 처리가 가능하므로 파라미터를 MultipartFile의 배열 타입으로 작성합니다.
업로드 페이지를 띄우고, 파일을 전송해봅니다.
파일을 선택하여 제출을 누르면 오른쪽 이미지의 로그에서 처럼 서버에서 파일을 받은 것을 확인할 수 있습니다.
그리고 지정한 경로에 해당 파일들이 전송되었는지 확인합니다.
오늘은 스프링 MVC에서 파일을 업로드 하는 방법에 대해 알아보았습니다.
'java, spring' 카테고리의 다른 글
[Spring framework] Controller의 Exception 처리 (0) | 2021.05.29 |
---|---|
[Spring Framework] 스프링 파일 업로드 Java config (0) | 2021.05.29 |
[Spring Framework] Controller의 리턴 타입 (0) | 2021.05.21 |
[Spring framework] 스프링 MVC 설정과 Controller, Model 실습 2 (0) | 2021.05.20 |
[Spring framework] 스프링 MVC 설정과 Controller 실습 1 (0) | 2021.05.19 |