내 블로그 목록

2018년 7월 27일 금요일

[SpringFramework] Controller을 이용한 파일 업로드 및 저장

스프링 컨트롤러를 이용한 파일 업로드 및 저장방법에 대해서 배워보도록 하겠다.


  1. 설치

사진에는 없지만 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가지가 있다.

  1. @RequestParam()을 사용하는 방법
  2. MultipartHttpServletRequest를 사용해서 request로 얻어오는 방법
  3. 빈 객체를 생성해서 이를 이용하는 방법.

우리는 이 세 가지 방법을 다 볼 것이다 .

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 객체를 넣어야 한다.

이것을 모두 실행하면,

이렇게 파일이 저장된다.






댓글 없음:

댓글 쓰기