관리 메뉴

DeseoDeSeo

[Spring] 파일 업로드 및 프로필 사진 출력하기 본문

spring

[Spring] 파일 업로드 및 프로필 사진 출력하기

deseodeseo 2023. 9. 20. 19:16

홈페이지 화면에서 이렇게 프로필 사진이 출력되도록 함.

파일 업로드
header.jsp
<li><a href="${contextPath}/imageform.do"><span class="glyphicon glyphicon-picture">프로필사진등록 </span>  </a></li>

 

MemberController.java

MultiRequest는 파일업로드를 직접적을 담당하는 클래스, 파일 업로드를 담당하는 생성자 및 여러 메서드를 포함하고 있다.

하단의 링크에서 복사해서 pom.xml에 붙여 넣음.

https://mvnrepository.com/artifact/servlets.com/cos/05Nov2002

@RequestMapping("/imageform.do")
	public String imageForm() {
		
		return"member/imageForm";
	}
	@RequestMapping("/imageUpdate.do")
	public String imageUpdate(HttpServletRequest request, HttpSession session, RedirectAttributes rttr) {
		
		//파일 업로드를 할 수 있게 도와주는 객체 필요.(cos.jar안에 있음)
		//파일 업로드를 할 수 있게 도와주는 MultipartRequest 객체를 생성하기 위해서는 
		// 5개의 정보가 필요하다.
		// 요청 데이터, 저장경로, 최대 크기, 인코딩, 파일명 중복제거 
		MultipartRequest multi = null;
		//저장경로
		String savePath = request.getRealPath("resources/upload");
		
		//이미지 최대크기
		int fileMaxSize = 10*1024*1024;
		//1.기본 해당 프로필 이미지 삭제
		// - 내가 현재 로그인 한 사람의 프로필 값을 가져와야함.
		String memID = ((Member)session.getAttribute("mvo")).getMemID();
		//getMember메서드는 memID와 일치하는 회원의 정보(Member)를가져온다.
		String oldImg =mapper.getMember(memID).getMemProfile();
		
		//기존의 프로필 사진 삭제
		//해당 경로안에 파일을 가져오겠다.
		File oldFile = new File(savePath+"/"+oldImg);
		if(oldFile.exists()) {
			oldFile.delete();
		}

		
		//객체 생성
		try {
			multi =new MultipartRequest(request,savePath, fileMaxSize, "UTF-8", new DefaultFileRenamePolicy() );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//내가 업로드한 파일 가져오기
		File file = multi.getFile("memProfile");
		//멤버 프로파일로 보냄. 객체 생성 후
		if(file != null) {
			//업로드가 된 상태
			//System.out.println(file.getName());
			String ext = file.getName().substring(file.getName().lastIndexOf(".")+1);
			ext=ext.toUpperCase();
			
			if(!(ext.equals("PNG") ||ext.equals("GIF")||ext.equals("JPG"))) {
				if(file.exists()) {
					file.delete();
					rttr.addFlashAttribute("msgType", "실패메세지");
					rttr.addFlashAttribute("msg", "이미지 파일만 가능합니다.");
					return "redirect:/imageForm.do";
				}
			}
			
			
		}
		
	
	
	}
imageForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ taglib prefix ="c" uri="http://java.sun.com/jsp/jstl/core" %>
	<%@ taglib prefix ="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="contextPath" value ="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<jsp:include page="../common/header.jsp"></jsp:include>
		<h2>Spring MVC03</h2>
		<div class="panel panel-default">
			<div class="panel-heading">Board</div>
			<div class="panel-body">
				<form action="${contextPath}/imageUpdate.do" method="post" enctype="multipart/form-data">
				
					<table style ="text-align:center; border: 1px solid #dddddd " class="table table-borded">
						<tr>
						 	<td style="width:110px; vertical-align:middle;">아이디</td>
						 	<td>${mvo.memID}</td>
						</tr>
						<tr>
						 	<td style="width:110px; vertical-align:middle;">사진 업로드</td>
						 	<td>
						 		<span class="btn btn-default">
						 			이미지를 업로드하세요.
						 			<input type="file" name="memProfile">
						 		</span>
						 	</td>
						</tr>
						
						<tr>
							<td colspan ="2">
							<span id="passMessage" style="color:red;"></span>
								<input type="submit" class="btn btn-primary btn-sm pull-right" value="등록">
								<input type="reset" class="btn btn-warning btn-sm pull-right" value="취소">
							
							</td>
						</tr>
						
					</table>
				</form>
			</div>
			
			<div class="panel-footer">스프링게시판-뇽뇽이</div>
		</div>
	</div>
	
	
	<script type="text/javascript">
		
		//html을 다 로딩할때 까지 기다리겠다.
		$(document).ready(function(){
			if(${not empty msgType}){
				if(${msgType eq "실패메세지"}){
					$("#messageType").attr("class","modal-content panel-warning");
				}
				$("#myMessage").modal("show");
			}
		});
		
		
	</script>

</body>
</html>
MemberMapper.java
	public int profileUpdate(Member mvo);
MemberMapper.xml
<update id="profileUpdate" parameterType="kr.spring.entity.Member">
		UPDATE MEMBER SET MEMPROFILE=#{memProfile} WHERE MEMID =#{memID}
	</update>

 

 

프로필 사진 페이지에 출력하기
header.jsp
 <c:if test="${empty mvo}">
      <ul class="nav navbar-nav navbar-right">
    
        		<li><a href="${contextPath}/loginForm.do"><span class="glyphicon glyphicon-globe"> 로그인</span> </a></li>
       			<li><a href="${contextPath}/joinForm.do"> 회원가입 </a></li>
             
      </ul>
      </c:if>
      
       <c:if test="${not empty mvo}">
      <ul class="nav navbar-nav navbar-right">
                <li>
                <c:if test="${mvo.memProfile ne ''}">
                	<img class="img-circle"style="width:50px; height:50px;"src="${contextPath}/resources/upload/${mvo.memProfile}">
					 ${mvo.memName}님 welcome.        
                </c:if>
                  <c:if test="${mvo.memProfile eq ''}">
                	<img class="img-circle"style="width:50px; height:50px;"src="${contextPath}/resources/images/default.jpg">
					 ${mvo.memName}님 welcome.        
                </c:if>
                
                
               	         
                </li>      
        		<li><a href="${contextPath}/updateForm.do"> <span class="glyphicon glyphicon-heart ">회원정보수정</span> </a></li>
        		<li><a href="${contextPath}/imageform.do"><span class="glyphicon glyphicon-picture">프로필사진등록 </span>  </a></li>
        		<li><a href="${contextPath}/logout.do"> <span class="glyphicon glyphicon-log-out">로그아웃</span> </a></li>
        	</ul>
       
       <!--db에는 파일이름만 저장. 실제로는 resource폴더 안에 진짜 img를 저장.  -->
      </c:if>
Membercontroller.java
	// 업로드한 파일의 이름을 가져오는 코드
		String newProfile = multi.getFilesystemName("memProfile");
		
		Member mvo= new Member();
		mvo.setMemID(memID);
		mvo.setMemProfile(newProfile);
		
		int cnt = mapper.profileUpdate(mvo);
		
		//사진 업데이트 후 수정된 회원정보를 다시 가져와서 세션에 담기
		Member m  =mapper.getMember(memID);
		session.setAttribute("mvo", m);
		
		rttr.addFlashAttribute("msgType", "성공메세지");
		rttr.addFlashAttribute("msg", "이미지 변경이 성공했습니다.");
		return "redirect:/";
MemberMapper.java
public Member getMember(String memID);
MemberMapper.xml
<select id="getMember" parameterType="String" resultType="kr.spring.entity.Member">
		SELECT * FROM MEMBER WHERE MEMID=#{memID}
	</select>