본문 바로가기

웹 프로그래밍/JSP

[JSP] form 태그로 파일을 보내는 방법

이런 복잡한 내용을 알지 못해도

get.getParameter 등으로 원하는 파일을 뽑아낼 수 있게 도와주는 라이브러리가 있다.

 

바로 cos.jar 이다.

(cos.jar 내에 있는 MultipartRequest.class가 그 역할을 함) 

.zip 파일 내에 lib 폴더 내에

cos.jar 가 있다.

WEB-INF / lib에 해당 jar 파일을 넣자.

 

cos.jar 내에 있는 MultipartRequest 클래스를 활용하자.

 

아래의 생성자를 호출하면서 saveFoler 내에 파일이 저장된다.

	String saveFolder = "D:/workspace/web/web-workspace/Mission-WEB/WebContent/upload";

	request.setCharacterEncoding("utf-8");
	MultipartRequest multi = new MultipartRequest( // new 하면서 생성자를 호출한다. 저장 작업이 이뤄짐.
						request, 
						saveFolder, 
						1024 * 1024 * 3, // 3MB 제한
						"utf-8",
						new KopoFileNamePolicy() // 이 메소드에 의해 파일명이 새롭게 변한다.
						
			);
package kr.ac.kopo.util;

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

import com.oreilly.servlet.multipart.FileRenamePolicy;

public class KopoFileNamePolicy implements FileRenamePolicy {

	@Override
	public File rename(File f) {
		String name = f.getName();
		String ext = "";
		int dot = name.lastIndexOf(".");
		if (dot != -1) {
			ext = name.substring(dot); 
		} else {
			ext = "";
		}
		String str = "kopo" + UUID.randomUUID(); // 난수가 생성된다.
		File renameFile = new File(f.getParent(), str + ext);
		return renameFile;
	}
}

 

 

 

 

 

 

 

 

 

 

 

 


writeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	function doWrite(){
		let f = document.wForm;
		if(f.title.value  == ''){
			alert('제목을 입력하세요.')
			f.title.focus();
			return false;
		} 
			return false;
		} 
		
		if(f.content.value  == ''){
			alert('내용을 입력하세요.')
			f.content.focus();
			return false;
		}
		
		// 파일 확장자 체크
		if(checkExt(f.attachfile1)) {
			return false;
		}
		
		if(checkExt(f.attachfile2)) {
			return false;
		}
		
		return true;
	}
	
	
	function checkExt(obj) {
		let forbidName = ['exe', 'bat', 'java', 'js', 'class', 'jsp'];
		let fileName = obj.value;
		let ext = fileName.substring(fileName.lastIndexOf('.')+1);
		
		for(let i = 0; i < forbidName.length; i++) {
			if(forbidName[i] == ext) {
				alert('[' + ext + '] 확장자는 파일 업로드 정책에 위배됩니다');
				return true;
			}
		}
		
		return false;
	}
	
	
	
	function doList(){
		location.href = "list.jsp";
	}
	
	// 고전적 이벤트 모델
	window.onload = function(){ // body 까지 읽고 난 후에 실행될 부분...
		let btn = document.getElementById("btnList");
		btn.onclick = function(){
			alert('click...')
			location.href = "list.jsp"
		}
	}
	
	
</script>

</head>
<body>

	<header>
		<jsp:include page="/jsp/include/topMenu.jsp" />
	</header>
	
	<section>
		<div align = "center">
			<hr width = "80%">
			<h2>게시물 등록폼</h2>
			<hr width = "80%">
			<br>
			
			<form action = "write.jsp" method = "post" name ="wForm" onsubmit="return doWrite()"
			enctype = "multipart/form-data"> <!-- url에 정보를 담지 않으려면, post 방식으로 보내야 한다. -->
				
				
				<table border = "1" style = "width : 80%">
					<tr>
						<th width = "23%">제목</th>
						<td><input type = "text" name = "title" size = "50"></td> <!-- name = value 형태로 보내야하니, name 속성을 반드시 정한다. -->
					</tr>
					<tr>
						<th>글쓴이</th>
						<td>${ userVO.id }</td>
						<input type="hidden" name="writer" value ="${ userVO.id }">
						<!-- <td><input type = "text" name = "writer" size = "50"></td> required = "required" 할 수도 있음. -->
						<!-- <td><input type = "text" name = "writer" size = "50" value = ${ userVO.id} readonly ></td> -->
					</tr>
					<tr>
						<th>내용</th>
						<td>
							<textarea rows="7" cols="60" name="content"></textarea>
						</td>
					</tr>
					<tr>
					<th>첨부파일</th>
					<td>
						<input type="file" name="attachfile1"><br>
						<input type="file" name="attachfile2"><br>
					</td>
				</tr>
					
				</table>
	
	
				<!-- <button type = "submit"></button> -->
				<input type = "submit" value = "등록">
				<!-- <input type = "button" value = "목록" onclick="doList()">   인라인 이벤트 모델(?) -->
				<input type = "button" value = "목록" id = "btnList">
				
			
			</form>
		</div>
	</section>
	
	<footer>
		<%@ include file="/jsp/include/footer.jsp" %>
	</footer>
	
</body>
</html>

 

write.jsp

<%@page import="kr.ac.kopo.util.KopoFileNamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="kr.ac.kopo.board.BoardDAO"%>
<%@page import="kr.ac.kopo.board.BoardVO"%>
<%@page import="kr.ac.kopo.util.JDBCClose"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="kr.ac.kopo.util.ConnectionFactory"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%-- 
	작업 순서
	1. writeForm.jsp에서 날라온 정보를 추출(제목, 글쓴이, 내용)
	2. 추출된 정보를 이용하여 데이터베이스 게시물 테이블에 저장
	3. 목록 페이지로 이동
--%>

<%

	String saveFolder = "D:/workspace/web/web-workspace/Mission-WEB/WebContent/upload";

	request.setCharacterEncoding("utf-8");
	MultipartRequest multi = new MultipartRequest( // new 하면서 생성자를 호출한다. 저장 작업이 이뤄짐.
						request, 
						saveFolder, 
						1024 * 1024 * 3, 
						"utf-8",
						new KopoFileNamePolicy()
						
			);
	

	/* //1단계
	request.setCharacterEncoding("utf-8");
	
	String title = request.getParameter("title");
	String writer = request.getParameter("writer");
	String content = request.getParameter("content");
	
	BoardVO board = new BoardVO();
	board.setTitle(title);
	board.setTitle(writer);
	board.setTitle(content);
	
	BoardDAO dao = new BoardDAO();
	dao.insertBoard(board);

	Connection conn = new ConnectionFactory().getConnetion();
	StringBuilder sql = new StringBuilder();
	sql.append(" insert into t_board(no, title, writer, content) ");
	sql.append(" values(seq_t_board_no.nextval, ?, ?, ?) ");
	PreparedStatement pstmt = conn.prepareStatement(sql.toString());
	
	pstmt.setString(1, title);
	pstmt.setString(2, writer);
	pstmt.setString(3, content);
	
	pstmt.executeUpdate(); // CRUD 할 때는 executeUpdate 문을 실행한다. 단순히 쿼리 날릴 때는 executeQuery 인듯
	JDBCClose.close(conn,pstmt); */

%>

<!-- 	새글 등록을 완료했습니다. <br>
	5초 후에 자동으로 목록게시판으로 이동합니다. 
	<a href = "list.jsp">목록으로 이동</a>
	
	<script>
		setTimeout(function(){
			location.href = "list.jsp";
		}, 5000)
	</script> -->
	
	<script>
		alert('게시판에 등록됐습니다.');
		location.href = "list.jsp";
	</script>