첨부파일을 서버에 전송하는 방식 중에 여러 가지가 있지만 그 중에서
서블릿 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 |