스프링 컨트롤러를 이용한 파일 업로드 및 저장방법에 대해서 배워보도록 하겠다.
- 설치
사진에는 없지만 pom.xml에 새로운 라이브러리들을 추가해준다.
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
|
[servlet-context.xml]
그리고 mutipartResolver를 servlet-context.xml에 추가 해준다.
빨간색으로 표시한 부분을 추가하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 파일업로드 처리를 위한 multipartResolver bean 등록 -->
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding">
<beans:value>utf-8</beans:value>
</beans:property>
</beans:bean>
<context:component-scan
base-package="com.bitcamp.mvc0727" />
</beans:beans>
|
먼저 파일 받는 페이지들을 만들기 전에 설명해야 할 부분이 있다.
컨트롤러에서 파일을 업로드하는 방법은 총 3가지가 있다.
- @RequestParam()을 사용하는 방법
- MultipartHttpServletRequest를 사용해서 request로 얻어오는 방법
- 빈 객체를 생성해서 이를 이용하는 방법.
우리는 이 세 가지 방법을 다 볼 것이다 .
0. 목록 만들기
먼저 결과를 볼 index를 만든다. 나머지 기능들도 구현했으니 첨부된 파일 링크를 참고하길 바란다.
[home.jsp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Spring MVC 20180727
</h1>
<ul>
<li><a href="order/order">Order</a></li>
<li><a href="cookie/viewCookie">viewCookie</a></li>
<li><a href="cookie/makeCookie">makeCookie</a></li>
<li><a href="header/headerInfo">header Info</a></li>
<li><a href="report/upload">FileUpload</a></li>
</ul>
</body>
</html>
|
1.파일을 받을 Form 작성하기.
[uploadForm.jsp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일 업로드</title>
</head>
<body>
<!-- 1. 파일 업로드는 무조건 post 방식으로 -->
<!-- @RequestParam -->
<form action="submitReport1" method="post" enctype="multipart/form-data">
학번 <input type="text" name="studentNumber"> <br>
이름 <input type="text" name="studentName"> <br>
리포트 파일 <input type="file" name="report"> <br>
<input type="submit">
</form>
<hr>
<!-- 2. MultipartHttpServletRequest 이용하기.-->
<form action="submitReport2" method="post" enctype="multipart/form-data">
학번 <input type="text" name="studentNumber"> <br>
이름 <input type="text" name="studentName"> <br>
리포트 파일 <input type="file" name="report"> <br>
<input type="submit">
</form>
<hr>
<!-- 3. 빈 객체 이용하기.-->
<form action="submitReport3" method="post" enctype="multipart/form-data">
학번 <input type="text" name="studentNumber"> <br>
이름 <input type="text" name="studentName"> <br>
리포트 파일 <input type="file" name="report"> <br>
<input type="submit">
</form>
</body>
</html>
|
2. 컨트롤러 만들기
[ReportSubmissionController.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
package com.bitcamp.mvc0727;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
public class ReportSubmissionController {
String dir = "C:\\uploadFile";
@RequestMapping(value="/report/upload", method=RequestMethod.GET)
public String form(){
return "report/uploadForm";
}
//1. @RequestParam
@RequestMapping(value="/report/submitReport1", method= RequestMethod.POST)
public String submitReport1(
@RequestParam("studentNumber") String studentNumber,
@RequestParam("studentName") String studentName,
@RequestParam("report") MultipartFile multipartFile,
Model model
) throws IllegalStateException, IOException {
System.out.println(studentNumber);
System.out.println(studentName);
System.out.println(multipartFile.getName());
System.out.println(multipartFile.getOriginalFilename());
System.out.println(multipartFile.getSize());
model.addAttribute("snum", studentNumber);
model.addAttribute("sname", studentName);
model.addAttribute("fileName", multipartFile.getOriginalFilename());
File file = new File(dir, multipartFile.getOriginalFilename());
multipartFile.transferTo(file);
return "report/uploadAct";
}
//2. MultipartHttpServletRequest 이용하기.
@RequestMapping(value="/report/submitReport2", method= RequestMethod.POST)
public String submitReport2(MultipartHttpServletRequest request, Model model) throws IllegalStateException, IOException {
String snum = request.getParameter("studentNumber");
String sname = request.getParameter("studentName");
//파일 받기
MultipartFile report = request.getFile("report");
String fileName = report.getOriginalFilename();
long fileSize = report.getSize();
System.out.println("학생번호 : "+snum);
System.out.println("학생이름 : "+sname);
System.out.println("파일이름 : "+fileName);
System.out.println("파일크기 : "+fileSize);
model.addAttribute("snum", snum);
model.addAttribute("sname", sname);
model.addAttribute("fileName", fileName);
report.transferTo(new File(dir, report.getOriginalFilename()));
return "report/uploadAct";
}
//3. 커맨드 객체(빈 객체)이용하기
@RequestMapping(value="/report/submitReport3", method= RequestMethod.POST)
public String submitReport3(FileReport fileReport, Model model) throws IllegalStateException, IOException {
System.out.println("학생번호 : "+ fileReport.getStudentName());
System.out.println("학생이름 : "+ fileReport.getStudentNumber());
System.out.println("파일이름 : "+ fileReport.getReport().getOriginalFilename());
System.out.println("파일크기 : "+ fileReport.getReport().getSize());
model.addAttribute("snum", fileReport.getStudentName());
model.addAttribute("sname", fileReport.getStudentNumber());
model.addAttribute("fileName", fileReport.getReport().getOriginalFilename());
fileReport.getReport().transferTo(new File(dir, fileReport.getReport().getOriginalFilename()));
return "report/uploadAct";
}
}
|
3. (3)번에서 사용할 빈 객체 FileReport.java를 만들어 준다.
[FileReport.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package com.bitcamp.mvc0727;
import org.springframework.web.multipart.MultipartFile;
public class FileReport {
private String studentNumber;
private String studentName;
private MultipartFile report;
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public MultipartFile getReport() {
return report;
}
public void setReport(MultipartFile report) {
this.report = report;
}
@Override
public String toString() {
return "FileReport [studentNumber=" + studentNumber + ", studentName=" + studentName + ", report=" + report
+ "]";
}
}
|
3. 결과보기
결과는 다음과 같다.
첫 번째 칸은 @RequestParam / 두 번째 칸은 MultipartHttpServletRequest / 세 번째 칸은 빈 객체으
로 구현한 것이다.
결과는 모두 똑같다.
(4) 업로드한 파일 저장하기
파란색으로 표시한 문장이 업로드한 파일을 저장하기 위한 것이다.
먼저, 경로를 지정해 준다.
String dir = "C:\\uploadFile";
나는 C드라이브 안에 uploadFile 파일을 만든다.
File file = new File(dir, multipartFile.getOriginalFilename());
multipartFile.transferTo(file);
참고로 transferTo() 메서드 안에는 File 객체를 넣어야 한다.
이것을 모두 실행하면,
이렇게 파일이 저장된다.
댓글 없음:
댓글 쓰기