티스토리 뷰
Chatper09. 파일 업로드 처리 : 이미지 파일 업로드하기
9.1 파일 업로드의 개요
9.1.1 파일 업로드
파일 업로드는 파일을 웹 브라우저에서 서버로 전송해 저장하는 것을 의미한다. 서버로 업로드할 수 있는 파일에는 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 종류가 있다. 웹 브라우저에서 서버로 파일을 전송하려면 jsp 페이지에 폼 태그를, 전송된 파일을 서버에 저장하려면 오픈 라이브러리를 사용해야 한다.
파일을 업로드 하고자하면 사전 환경 설정이 필요하다.
파일 업로드를 위한 환경 설정
step1. pom.xml 파일에 의존 라이브러리 등록하기
스프링 MVC에서 파일 업로드 기능을 지원하는 commons-fileupload.jar과 commons-ir.jar 파일을 라이브러리로 등록해야 한다.
pom.xml 파일에 아래와 같이 의존 라이브러리 정보를 등록한다.
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
step2. servlet-context.xml 파일에 시큐리티 필터 등록하기
스프링 MVC는 파일을 업로드하기 위해 별도의 처리 없이 서버로 전송하는 매개변수와 파일 정보를 쉽게 전달받을 수 있는 멀티파트 기능을 지원한다. 스프링의 멀티파트 기능을 이용하려면 MultipartResolver를 servlet-context.xml 파일에 등록해야한다.
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="100000"/> //업로드할 수 있는 파일의 최대 사이즈
<beans:property name="defaultEncoding" value="utf-8"/> //기본 인코딩
<beans:property name="uploadTempDir" ref="uploadDirResource"/> //임시 저장 공간
</beans:bean>
<beans:bean id="uploadDirResource" class="org.springframework.core.io.FileSystemResource">
<beans:constructor-arg value="c:/upload/"/> //저장 위치
</beans:bean>
9.1.2 파일 업로드를 위한 웹 페이지
웹 브라우저에서 서버로 파일을 전송할 수 있는jsp 페이지가 필요하다. jsp 페이지의 폼 태그를 작성할 때는 아래와 같이 몇 가지 규칙을 반드시 따라야 한다.
<form method="post" enctype="multipart/form-data">
<input type="file" name="요청 매개변수 이름">
</form>
1. <form> 태그의 method 속성은 반드시 post 방식으로 설정해야 한다.
2. <form> 태그의 enctype 속성은 반드시 multipart/form-data로 설정해야 한다.
3. <input> 태그의 type 속성은 file로 설정해야 한다. 파일 여러 개를 업로드하려면 두개 이상의 <input> 태그를 사용해야 하고, name 속성은 서로 다른 값으로 설정해야 한다.
9.2 MultipartFile을 사용한 파일 업로드
9.2.1 MultipartFile 인터페이스의 개요
MultipartFile 인터페이스는 컨트롤러에 멀티파트 요청으로 들어오는 매개변수 중에서 업로드된 파일 및 파일 데이터를 표현할 때 사용된다. 여기에서 MultipartFile을 사용하려면 org.springframework.web.multipart.MultipartFile을 임포트 해야한다.
MultipartFile 인터페이스의 주요 메서드
메서드 이름 | 타입 | 설명 |
getName() | String | 멀티파트 폼에서 매개변수 이름을 반환한다. |
getContentType() | String | 파일의 콘텐츠 형식을 반환한다. |
getOriginalFilename() | String | 클라이언트의 파일 세스템에서 실제 파일 이름을 반환한다. |
isEmpty() | boolean | 업로드한 파일이 있는지 반환한다. |
getSize() | long | 바이트의 파일 크기를 반환한다. |
getBytes() | byte[] | 바이트의 배열로 파일 내용을 반환한다. (실제 파일 내용 가져옴) |
getINputStream() | InputStream | 파일 폼의 내용을 읽어 InputStream을 반환한다. |
transferT0(File des) | void | 수신된 파일을 지정한 대상 파일에 전송한다. |
9.2.2 파일 업로드 유형
@RequestParam 이용하기
@RequestParam으로 파일을 업로드하는 방법은 멀티파트 요청이 들어올 때 요청 처리 메서드의 매개변수에 @RequestParam이 적용된 MultipartFIle타입의 매개변수를 사용하는 것이다.
그러므로 업로드한 파일 데이터를 전달 받으려면 @RequestParma과 MultipartFile타입의 매개변수를 사용해야 한다.
@RequestParam 을 적용한 파일 업로드 예시
Example01Controller.java
package com.springmvc.chap09;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("/exam01")
public class Example01Controller {
@GetMapping("/form")
public String requestForm() {
return "webpage09_01";
}
@PostMapping("/form")
public String submitForm(@RequestParam("name") String name, @RequestParam("fileImage") MultipartFile file) {
String filename = file.getOriginalFilename();
File f = new File("D:\\upload\\"+name+"_"+filename);
try {
file.transferTo(f);
}
catch(IOException e) {
e.printStackTrace();
}
return "webpage09_submit";
}
}
webpage09_01.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>File Upload</title>
</head>
<body>
<h3>파일업로드</h3>
<form action="form" method="post" enctype="multipart/form-data">
<p>이름 : <input type="text" name="name"/>
<p>파일 : <input type="file" name="fileImage"/>
<p><input type="submit" value="전송하기"/>
<input type="reset" value="다시쓰기"/>
</form>
</body>
</html>
webpage09_submit.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>File Upload</title>
</head>
<body>
<h3>파일업로드</h3>
파일업로드 성공했습니다.
</body>
</html>
MultipartHttpServletRequest 인터페이스 사용하기
MultipartHttpServletRequest 인터페이스를 사용하여 파일을 업로드하는 방법은 스프링이 제공하는 HttpServletRequest와 MultipartRequest 인터페이스를 상속받아 파일을 업로드하는 방법이다.
이때 웹 요청 정보를 얻으려면 HttpServletRequest가 제공하는 getParameter() 메서드를 MultipartFile 데이터를 받으려면 MultipartRequest가 제공하는 메서드를 사용해야 한다.
MulipartRequest 인터페이스 주요 메서드
메서드 이름 | 타입 | 설명 |
getFile(String name) | MultipartFile | 이 요청에 업로드된 파일의 설명과 내용을 반환한다. 없을 때는 null을 반환한다. |
getFileMap() | Map<String, MultipartFile> | 이 요청에 포함된 멀티 파트 파일의 Map을 반환한다. |
getFileNames() | Iterator<String> | 이 요청에 포함된 멀티파트의 매개변수 이름이 포함된 String 객체의 Iterator를 반환한다. |
getFiles(String name) | List<MultipartFile> | 이 요청에 업로드된 파일의 내용과 설명을 반환한다. 없으면 빈 List를 반환한다. |
getMultiFileMap() | MultiValueMap<String, MultipartFile> | 이 요청에 포함된 멀티파트의 MultiValueMap을 반환한다. |
getMultipartContentType(String aramOrFIleName) | String | 지정된 요청 부분의 content 타입을 결정한다. |
package com.springmvc.chap09;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
@RequestMapping("/exam02")
public class Example02Controller {
@GetMapping("/form")
public String requestForm() {
return "webpage09_01";
}
@PostMapping("/form")
public String submitForm(MultipartHttpServletRequest request) {
String name = request.getParameter("name");
MultipartFile file = request.getFile("fileImage");
String filename = file.getOriginalFilename();
File f = new File("c:\\upload\\" + name + "_" +filename);
try {
file.transferTo(f);
}
catch(IOException e) {
e.printStackTrace();
}
return "webpage09_submit";
}
}
@ModelAttribute 이용하기
@ModelAttribute를 이용하여 파일을 업로드하는 방법은 멀티파트 요청 매개변수와 동일한 이름으로 커맨드 객체에 MultipartFile 타입의 프로퍼티를 추가하는 방법이다.
Member.java
package com.springmvc.chap09;
import org.springframework.web.multipart.MultipartFile;
public class Member {
private String name;
private MultipartFile imageFile;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MultipartFile getImageFile() {
return imageFile;
}
public void setImageFile(MultipartFile imageFile) {
this.imageFile = imageFile;
}
}
Example03Controller.java
package com.springmvc.chap09;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
@RequestMapping("/exam03")
public class Example03Controller {
@GetMapping("/form")
public String requestForm(Member member) {
return "webpage09_02";
}
@PostMapping("/form")
public String submitForm(@ModelAttribute("member") Member member, MultipartHttpServletRequest request) {
String name = request.getParameter("name");
MultipartFile file = request.getFile("fileImage");
String filename = file.getOriginalFilename();
File f = new File("c:\\upload\\" + name + "_" +filename);
try {
file.transferTo(f);
}
catch(IOException e) {
e.printStackTrace();
}
return "webpage09_submit";
}
}
webpage09_02.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>File upload</title>
</head>
<body>
<h3>파일 업로드</h3>
<form:form action="form" modelAttribute="member" method="post" enctype="multipart/form-data">
<p>이름 : <form:input path="name" />
<p>파일 : <form:input path="imageFile" type="file"/>
<p><input type="submit" value="전송하기"/>
<input type="reset" value="다시쓰기" />
</form:form>
</body>
</html>
'코딩 > spring' 카테고리의 다른 글
[16주 2일차] 예외 처리 (0) | 2024.01.23 |
---|---|
[16주 2일차] 파일 업로드 처리 : 이미지 파일 업로드하기 (0) | 2024.01.23 |
[16주 1일차] 스프링 시큐리티 : 로그인/로그아웃 페이지 만들기 (0) | 2024.01.22 |
[16주 1일차] 스프링 시큐리티 (0) | 2024.01.22 |
[15주 5일차] 스프링 폼 태그 (0) | 2024.01.19 |
- Total
- Today
- Yesterday