본문 바로가기

SPRING

파일 업로드 처리 : MultipartResolver

첨부파일을 서버에 전송하는 방식 중에 여러 가지가 있지만 그 중에서

서블릿 3.0 이상에서는 자체적인 파일 업로드 처리가 API 상에서 지원된다.

이 방법을 통해 파일 업로드를 처리해보자.

 

 

 

1. 임시로 업로드될 폴더 경로 만들기

/Users/dabin/upload/tmp

 

 

2. pom.xml에 라이브러리 수정 및 추가

 

<!-- 각 버전 수정 -->
<properties>
	<java-version>1.8</java-version>
	<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
	<org.aspectj-version>1.9.0</org.aspectj-version>
	<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>
				
<!-- Servlet 버전 수정 (3.0 이상으로) -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
	<scope>provided</scope>
</dependency>

 

 

3. web.xml 설정

Tomcat이 관여하는 첨부파일의 처리에 대한 설정을 한다.

서블릿 3.1 버전으로 web.xml 파일의 헤더 부분의 변경이 필요하다.

파일 업로드를 위해 <multipart-config> 설정도 추가해준다.

 

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">
	
	<!-- 생략 -->
    
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
		
		<!-- 파일 업로드 설정 -->
		<multipart-config>
			<location>/Users/dabin/upload/tmp</location>
			<max-file-size>20971520</max-file-size> 
			<max-request-size>41943040</max-request-size> 
			<file-size-threshold>20971520</file-size-threshold> 
		</multipart-config> 
	</servlet>
    
	<!-- 생략 -->

</web-app>

 

location : 업로드되는 파일을 저장할 공간

max-file-size : 업로드되는 파일의 최대 크기 (바이트 단위로 약 20MB)

max-request-size : 한 번에 올릴 수 있는 최대 크기 (바이트 단위로 약 40MB)

file-size-threshold : 특정 사이즈의 메모리 사용 (바이트 단위)

 

 

 

3. servlet-context.xml 설정

 

<!-- 첨부 파일을 처리하는 빈 -->
<beans:bean id="multipartResolver" 
 class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

 

 

4. jsp 파일 작성

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="uploadFormAction" method="post" enctype="multipart/form-data">
		<input type="file" name="uploadFile" multiple>
		<button>확인</button>
	</form>
</body>
</html>

 

enctype="multipart/form-data"

전송되는 데이터 형식 설정으로 파일이나 이미지를 서버로 전송할 경우 사용한다.

이 설정을 생략하면 데이터를 넘길 때 파일의 경로명만 전송되고 파일 내용은 전송되지 않는다.

 

multiple 속성

이 속성을 이용하면 ctrl이나 shift키를 이용하여 한꺼번에 여러 개의 파일을 업로드할 수 있다.

만약 특정 파일로 지정하고 싶을 경우, 아래와 같이 accept 속성을 추가해주자.

 

<input type="file" accept=".png, .jpg, .pdf, .hwp">
<input type="file" accept="text/plain">
<input type="file" accept="text/html">
<input type="file" accept="image/*">
<input type="file" accept="video/*">
<input type="file" accept="audio/*">

 

 

5. Controller 작성

 

MultipartFile 타입

파일을 쉽게 업로드할 수 있도록 해준다. 자주 사용하는 메서드를 알아보자.

 

String getOriginalFilename() : 업로드되는 파일의 이름

long getSize() : 업로드되는 파일의 크기

transferTo(File file) : 파일 저장

 

package org.zerock.controller;

import java.io.File;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;

import lombok.extern.log4j.Log4j;

@Controller
@Log4j
public class UploadController {
	
	@GetMapping("/uploadForm")
	public void uploadForm() {
		log.info("upload form");
	}
	
	@PostMapping("/uploadFormAction")
	public void uploadFormPost(MultipartFile[] uploadFile, Model model) {
    				  // 배열 타입으로 선언하여 여러 개의 파일 저장
		
		String uploadFolder = "/Users/dabin/upload/tmp"; // 저장 위치
		
		for(MultipartFile multipartFile : uploadFile) {
			log.info("--------------------");
			log.info("Upload File Name: " + multipartFile.getOriginalFilename());
			log.info("Upload File Size: " + multipartFile.getSize());
			
			// 파일 저장 로직
			File savaFile = new File(uploadFolder, multipartFile.getOriginalFilename());
			
			try {
				multipartFile.transferTo(savaFile); // 저장
			} catch(Exception e) {
				log.error(e.getMessage());
			} 
		}
		
	}
	
}

'SPRING' 카테고리의 다른 글

비밀번호 변경하기  (0) 2020.10.12
404 NOT_FOUND 처리하기  (0) 2020.10.11
Model 객체 / @ModelAttribute  (0) 2020.10.11
@RequestParam 어노테이션  (0) 2020.10.11
Lombok / Junit 라이브러리  (0) 2020.10.10