java, spring

[Spring framework] fileupload, 스프링 파일 업로드

isaac.kim 2021. 5. 29. 14:21
728x90
반응형

 

[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

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에서 파일을 업로드 하는 방법에 대해 알아보았습니다.

728x90
반응형