본문 바로가기
WEB/Spring

[Spring] Spring FileUpload + 예제 실습

by 댕꼬 2022. 4. 24.

Spring Framework기반 사용자정보 관리 애플리케이션


사용자 등록 시 이미지가 있다면, 같이 등록하며 결과화면으로 출력하기

 

요구사항

 

- pom.xml에 파일업로드를 위한 의존성 확인

- 기존 Dto인 User에 이미지를 저장하는 필드 추가

- servlet-context.xml에 파일업로드를 위해 multipartResolver를 추가

- 사용자 정보를 입력받기 위해 regist.jsp에 input태그 추가와 form의 enctype수정

- UserController에서 /regist처리 과정 중 User와 함께 전달된 MultiPartFile을 처리

  (전달 된 파일은 resources/upload에 저장되도록 하기)

- regist_result.jsp에서 사용자 등록 시 이미지를 등록하였다면 결과화면에 같이 보여주도록 작성

 

 

pom.xml

commons-fileupload 추가

 

User.java

img 추가

 

servlet-context.xml

<?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 https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://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>
	
	<context:component-scan base-package="com.ssafy.hw.controller" />
	
	<!-- file upload를 처리할 multipart resolver를 구성한다. -->
	<beans:bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="defaultEncoding" value="UTF-8"></beans:property>
	</beans:bean>
	
</beans:beans>

regist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SSAFY 사용자 관리</title>
<style>
	label{
		display: inline-block;
		width: 80px;
	}
	textarea {
	width: 100%;
}
</style>
</head>
<body>
	<h1>SSAFY 사용자 관리</h1>
	<form method="post" action="regist" enctype="multipart/form-data">
		<fieldset>
		<legend>사용자 정보 입력</legend>
		<label for="id">아이디</label>
		<input type="text" id="id" name="id"><br>
		<label for="password">비밀번호</label>
		<input type="password" id="password" name="password"><br>
		<label for="name">이름</label>
		<input type="text" id="name" name="name"><br>
		<label for="email">이메일</label>
		<input type="email" id="email" name="email"><br>
		<label for="age">나이</label>
		<input type="number" id="age" name="age"><br>
		<label for="userImg">이미지</label>
		<input type="file" id="userImg" name="userImg"><br>
		<input type="submit" value="등록">
		<input type="reset" value="초기화">
		</fieldset>
	</form>
</body>
</html>

 

 

UserController.java

package com.ssafy.hw.controller;

import java.io.File;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
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.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.ssafy.hw.dto.User;

// 이 클래스가 컨트롤러 임을 어노테이션으로 설정, 컴포넌트 스캔을 통해 빈으로 등록
@Controller
public class UserController {
	
	// 파일처리를 위해 시스템 정보를 가져오는 로더 (빈으로 주입)
	@Autowired
	ResourceLoader resLoader;
	
	/**
	 * '/' 또는 '/index' 요청이 get 방식으로 들어왔을 때 index로 연결한다.
	 * @return
	 */
	@GetMapping({"/", "/index" })
	public String showIndex() {
		return "index";
	}
	
	/**
	 * '/regist' 요청이 get 방식으로 들어왔을 때 regist로 연결한다.
	 * @return
	 */
	@GetMapping("/regist")
	public String showRegistForm() {
		return "regist";
	}

	/**
	 * '/regist' 요청이 post 방식으로 들어왔을 때 전달된 User 객체를 regist_result로 연결한다. 
	 * @param movie
	 * @return
	 */
	@PostMapping("/regist")
	// Img파일은 MultipartFile 타입으로 받는다고 따로 명시한다.
	public ModelAndView doRegist(User user, @RequestParam("userImg") MultipartFile file) throws Exception {
		ModelAndView mav = new ModelAndView();
		
		// 파일을 업로드할 경로
		Resource res = resLoader.getResource("resources/upload");
		
		if(file != null && file.getSize() > 0) {
			// 파일 이름 가져와서 user 객체의 setter를 통해 설정
			user.setImg(file.getOriginalFilename());
			// 지정한 경로에 이미지 파일 저장
			file.transferTo(new File(res.getFile().getCanonicalPath() + "/" + user.getImg()));
		}
		// 어디로 연결할지 설정
		mav.setViewName("regist_result");
		// 전달할 객체
		mav.addObject("user", user);
		return mav;
	}
}

 

regist_result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 등록 결과</title>
<style>
table {
	border-collapse: collapse;
	width: 100%;
}

th, td {
	border: 1px solid black;
}

th:nth-child(1) {
	width: 100px;
}
</style>
</head>
<body>
	<h1>사용자 등록 결과</h1>
	<h2>등록 사용자 정보</h2>
	<table>
		<thead>
			<tr>
				<th>항목</th>
				<th>내용</th>
			</tr>
		</thead>
		<tbody>
			<c:if test="${not empty user.img}">
				<tr>
					<td>프로필<br>이미지</td>
					<td><img
						src="${pageContext.request.contextPath }/resources/upload/${user.img }">
					</td>
				</tr>
			</c:if>
			<tr>
				<td>아이디</td>
				<td>${user.id }</td>
			</tr>
			<tr>
				<td>비밀번호</td>
				<td>${user.password }</td>
			</tr>
			<tr>
				<td>이름</td>
				<td>${user.name }</td>
			</tr>
			<tr>
				<td>이메일</td>
				<td>${user.email }</td>
			</tr>
			<tr>
				<td>나이</td>
				<td>${user.age }</td>
			</tr>
		</tbody>
	</table>
	<!-- 다시 사용자를 등록할 수 있는 링크를 제공한다. -->
	<a href="./regist">추가등록</a>
</body>
</html>

 

 

실행화면

사용자 등록화면
사용자 등록 결과화면

 

'WEB > Spring' 카테고리의 다른 글

[Spring] Spring REST API  (0) 2022.04.25
[Spring] Spring MyBatis + 예제 실습  (0) 2022.04.25
[Spring] Spring Interceptor /Filter + 예제 실습  (0) 2022.04.24
[Spring] Spring AOP + 예제 실습  (0) 2022.04.24
[Spring] Spring MVC + 예제 실습  (0) 2022.04.23

댓글