본문 바로가기

안녕하세요!

프로그래밍 언어/JSP

JSP_22-11-15

[ 파일 올리기 ]

○ Apache commons IO 2.11.0v

https://mvnrepository.com/artifact/commons-io/commons-io

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

○ Apache commons IO 1.4v

https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload/1.4

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

○ imgscarl A Java scaling Library 4.2

https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib/4.2

<!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib -->
<dependency>
    <groupId>org.imgscalr</groupId>
    <artifactId>imgscalr-lib</artifactId>
    <version>4.2</version>
</dependency>

○ Javax Annotaion API 1.3.2

    - @Resource에 사용(자바 11버전 이상일 때)

https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api/1.3.2

<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

[ uploadForm.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="fmt"	uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 올리기</title>
<style>
iframe	{
	width:			800px;
	height:			800px;
	border:			1px;
	border-style:	solid;
}
</style>



</head>
<body>

<!-- 상단 메뉴 -->
<jsp:include page="../../common/topMenu.jsp" flush="false"/>

<div class="container">
	<!-- target="iframe1" -->
	<!-- 파일 업로드하면 원래는 action="${contextPath}/util/upload/uploadForm"으로 이동해야 하지만
		 페이지를 넘어가지 않기 위해서 제출된 결과를 iframe으로 보낸다. -->
	<form class="form-horizontal" action="${contextPath}/util/upload/uploadForm" method="post"
		enctype="multipart/form-data" target="iframe1">
		<!-- name="file"의 변수명과 컨트롤러의 MultipartFile file과 일치해야 한다. -->
		<div class="form-group">
			<div class="col-sm-8">
				<input type="file" class="btn btn-warning" name="file"/>
				<input type="submit" class="btn btn-primary" value="파일올리기"/>
			</div>
		</div>
		<!-- iframe에 업로드한 결과를 출력한다. -->
		<div class="form-group">
			<div class="col-sm-12">
				<iframe name="iframe1"></iframe>
			</div>
		</div>
	</form>
</div>

<!-- 하단 메뉴 -->
<jsp:include page="../../common/footer.jsp" flush="false"/>

</body>
</html>

 

[ UploadController.java ]

package com.edu.util.upload;

import java.io.File;
import java.util.UUID;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

//-------------------------------------------------------------------------------------
// 파일 올리기 컨트롤러
// servlet-context.xml애 component-scan을 등록한다.
//-------------------------------------------------------------------------------------
@Controller
@RequestMapping(value = "/util/upload")
public class UploadController {

	private static final Logger logger = LoggerFactory.getLogger(UploadController.class);
	
	//-------------------------------------------------------------------------------------
	// sevlet-context.xml에서 선언한 파일 올리기 설정을 참조한다.
	// 자바 11부터는 @Resource를 사용하기 위해서
	// https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api를 pom.xml에 추가한다.
	//
	// 파일 업로드 경로 : servlet-context.xml에 기술한다.
	//-------------------------------------------------------------------------------------
	@Resource(name = "uploadPath")
	// String uploadPath = "c:/data/upload"; <= 직접 기술해도된다.
	String uploadPath; // 파일 경로를 공통으로 사용하기 위해서 선언한다.
	
	
	//-------------------------------------------------------------------------------------
	// 파일 올리기 화면으로 이동
	//-------------------------------------------------------------------------------------
	@RequestMapping(value = "/uploadForm", method = RequestMethod.GET)
	public String uploadForm() {
		
		logger.info("UploadController 파일 올리기 화면으로 이동.....");
		
		return "/util/upload/uploadForm";
	} // End - 파일 올리기 화면으로 이동
	
	//-------------------------------------------------------------------------------------
	// 업로드된 파일 처리하기
	// MultipartFile file: 업로드한 파일이 저장된다.(임시경로)
	//-------------------------------------------------------------------------------------
	@RequestMapping(value = "/uploadForm", method = RequestMethod.POST)
	public ModelAndView uploadForm(MultipartFile file, ModelAndView mav) throws Exception {
		
		if(!file.isEmpty()) {
			System.out.println("첨부된 파일이 존재합니다.");
		} else {
			System.out.println("첨부된 파일이 존재하지 않습니다.");
		}
		
		System.out.println("파 일 이 름 : " + file.getOriginalFilename());
		System.out.println("파 일 크 기 : " + file.getSize());
		System.out.println("컨텐츠 타입 : " + file.getContentType());
		
		String savedName = file.getOriginalFilename();
		savedName = uploadFile(savedName, file.getBytes());
		
		mav.setViewName("util/upload/uploadResult");	// 뷰의 이름 : 처리가 끝나고 돌아갈 페이지
		mav.addObject("savedName", savedName);			// 전달할 데이터
		return mav;										// uploadResult.jsp로 포워딩 된다.		
	} // End - 업로드된 파일 처리하기
	
	//-------------------------------------------------------------------------------------
	// 파일 이름
	//-------------------------------------------------------------------------------------
	String uploadFile(String originalName, byte[] fileData) throws Exception {
		
		UUID uuid = UUID.randomUUID();
		
		// UUID = Universal Unuique IDentifier(범용 식별자) => 코드를 랜덤으로 만들어 낸다.
		String savedName = uuid.toString() + "_" + originalName;
		
		// new File(디렉토리, 파일이름);
		File target = new File(uploadPath, savedName);
		
		// 첨부파일을 임시 디렉토리에서 우리가 지정한 디렉토리로 복사한다.
		FileCopyUtils.copy(fileData, target);
		
		return savedName;
	}
	
	
	
	
	
	
} // End - 파일 올리기 컨트롤러

 

[ upLoadAjax.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="fmt"	uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 올리기 (AJAX)</title>
<style>
	.fileDrop	{
		width:			1000px;
		height:			500px;
		border:			1px dotted blue;
	}
	small	{
		margin-left:	3px;
		font-weight:	bold;
		color:			gray;
	}

</style>
</head>
<body>

<!-- 상단 메뉴 -->
<jsp:include page="../../common/topMenu.jsp" flush="false"/>

<div class="container">
	<h2>Ajax File Upload</h2>
	<div class="fileDrop"></div>		<!-- 파일을 업로드할 영역 -->
	<div class="uploadedList"></div>	<!-- 업로드된 파일 목록을 출력할 영역 -->
</div>

<!-- 하단 메뉴 -->
<jsp:include page="../../common/footer.jsp" flush="false"/>


</body>

<script>
//-------------------------------------------------------------------------------------
// 스크립트는 jQuery를 불러들인 다음에 기술한다.
// 순서가 바뀌면 스크립트가 작동되지 않는다.
//-------------------------------------------------------------------------------------
$(function() {
	
	
	//-------------------------------------------------------------------------------------
	// 드래그의 기본 효과를 막는다.
	// 드래그의 기본효과를 막지 않으면 드래그된 곳에 이미지가 보이게 된다.
	//-------------------------------------------------------------------------------------
	$(".fileDrop").on("dragenter dragover", function(event) {
		event.preventDefault();
	})
	
	//-------------------------------------------------------------------------------------
	// 그림 전송 영역에 그림을 떨어뜨릴 때 처리하는 함수
	//-------------------------------------------------------------------------------------
	$(".fileDrop").on("drop", function(event) {
		alert("그림을 떨어뜨렸습니다.");
		// 그림이 drop될 때의 기본효과를 막는다.
		event.preventDefault();
	});
	
	// 첨부파일 배열 : 드래그된 파일의 정보
	// Ctrl + 클릭으로 여러 개의 파일을 동시에 올릴 수 있다.
	var files = event.originalEvent.dataTransfer.files;
	
	var file = files[0];	// 첫 번재 파일
	
	// 파일 정보가 콘솔에 올라간다.
	// 웹 브라우저에서 F12키를 누르면 어떤 파일인지 알 수가 있다.
	console.log(file);
	
	// AJAX로 서버에 전달할 대에는 폼이 별도로 존재하지 않기 대문에 폼 객체를 만들어 주어야 한다.
	var formData = new formData();	// 폼 객체
	
	// 폼에 file 변수를 추가한다.
	formData.append("file", file);
	
	// 서버에 파일을 업로드한다.
	// contentType : false => multipart/form-data로 처리가 된다.
	$.ajax({
		
	})
})


</script>


</html>

 

[ AjaxUploadController.java ]

package com.edu.util.upload;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

//-------------------------------------------------------------------------------------
// AJAX 이용해 파일 올리기
//-------------------------------------------------------------------------------------
@Controller
@RequestMapping(value="/util/upload")
public class AjaxUploadController {

	private static final Logger logger = LoggerFactory.getLogger(AjaxUploadController.class);

	// 업로드할 경로(디렉토리)는 servlet-context.xml에 설정해 놓았다.
	@Resource(name = "uploadPath")
	String uploadPath;
	
	//-------------------------------------------------------------------------------------
	// 파일 올리기(AJAX) 화면 불러오기
	//-------------------------------------------------------------------------------------
	@RequestMapping(value="/uploadAjax", method=RequestMethod.GET)
	public String uploadAjax() {
		
		logger.info("AjaxUploadController 파일 올리기(AJAX) 화면 불러오기");
		return "/util/upload/uploadAjax";
		
	} // End - 파일 올리기(AJAX) 화면 불러오기
	
	
	
}

 

[ uploadResult.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="fmt"	uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<div class="container">
	<h2>파일이 업로드 되었습니다.</h2>
	<h3>파일명 : ${savedName}</h3>
</div>

</body>
</html>

 

[ MediaUtils.java ]

package com.edu.util.upload;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.MediaType;

//-------------------------------------------------------------------------------------
// 업로드에 사용할 미디어에 대한 정의 클래스
//-------------------------------------------------------------------------------------
public class MediaUtils {

	// static으로 선언되었으므로 프로그램이 실행될 때
	// private static Map<String, MediaType; 과 static{}은 바로 메모리에 로딩된다.
	private static Map<String, MediaType> mediaMap;
	
	//-------------------------------------------------------------------------------------
	// static block
	// 클래스를 로딩할 때 제일 먼저 실행되는 코드
	//-------------------------------------------------------------------------------------
	static {
		mediaMap	= new HashMap<>();
		mediaMap.put("JPG", MediaType.IMAGE_JPEG);
		mediaMap.put("GIF", MediaType.IMAGE_GIF);
		mediaMap.put("PNG", MediaType.IMAGE_PNG);
	}
	//-------------------------------------------------------------------------------------
	// 이미지 파일인지 아닌지 구분하는 메서드
	// 이미지 파일을 업로드하면 썸네일 파일을 만들고, 나머지 파일들은 그냥 업로드한다.
	// getMediaType(String type)을 호출하여
	// 위의 static{}에 있으면 이미지 파일, 아니면 일반 파일이다.
	//-------------------------------------------------------------------------------------
	public static MediaType getMediaType(String type) {
		
		// toUpperCase() => 대문자로 변경
		return mediaMap.get(type.toUpperCase());
		
	} // End - 이미지 파일인지 아닌지 구분하는 메서드
	
	
	
} // End - 업로드에 사용할 미디어에 대한 정의 클래스

 

[ topMenu.jsp ]

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<%	request.setCharacterEncoding("UTF-8"); %>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>	

<%	/*
	sticky-top은 상단 공간을 차지하면서 위에 고정하고,
	fixed-top은 상단 공간을 차지하지 않고 위에 고정된다.
	일부 내용이 상단 메뉴바에 가려져서 보이지 않을 수 있다.
	*/
%>
<nav class="navbar navbar-inverse navbar-sticky-top">
	<div class="container-fluid">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="${contextPath}/main.do">쇼핑몰</a>
		</div>
		<!-- 실질적인 메뉴를 나열한다. -->
		<div class="collapse navbar-collapse" id="myNavbar">
			<ul class="nav navbar-nav navbar-left">
				<li>
					<form class="navbar-form navbar-right" method="post" action="${contextPath}/member/login.do">
						<c:choose>
							<c:when test="${isLogOn == true && member != null}">
								<p class="navbar-text"><b>${member.name}님, 즐거운 시간되십시요.</b></p>
								<a href="${contextPath}/member/logout.do" class="btn btn-danger">
								<span class="glyphicon glyphicon-log-out"></span> 로그아웃</a>
							</c:when>
							<c:otherwise>
								<div class="form-group">
									<input type="text"     class="form-control" name="id"  size="12" maxlength="12" placeholder="아이디"/>
									<input type="password" class="form-control" name="pwd" size="12" maxlength="12" placeholder="비밀번호"/>
								</div>
								<button type="submit" class="btn btn-primary">
									<span class="glyphicon glyphicon-log-in"></span> 로그인
								</button>
							</c:otherwise>
						</c:choose>
					</form>
				</li>
				<li class="dropdown">
					<a class="dropdown-toggle" data-toggle="dropdown" href="#">회원관리 <span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="${contextPath}/member/loginForm.do">로그인</a></li>
						<li><a href="${contextPath}/member/memberForm.do">회원가입</a></li>
						<li><a href="${contextPath}/member/registerAjaxForm.do">회원가입(AJAX)</a></li>
						<li><a href="${contextPath}/member/listMembers.do">회원 목록 조회</a></li>
					</ul>
				</li>
				<li class="dropdown">
					<a class="dropdown-toggle" data-toggle="dropdown" href="#">파일 올리기 <span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="${contextPath}/util/upload/uploadForm">파일 올리기 (Form)</a></li>
						<li><a href="${contextPath}/util/upload/uploadAjax">파일 올리기 (Ajax)</a></li>
					</ul>
				</li>
			</ul>
		</div>
	</div>
</nav>

 

728x90
반응형

'프로그래밍 언어 > JSP' 카테고리의 다른 글

JSP_22-11-18  (0) 2022.11.18
JSP_22-11-17  (0) 2022.11.17
JSP_22-11-07  (0) 2022.11.15
JSP_22-11-14  (0) 2022.11.15

loading