이런 복잡한 내용을 알지 못해도
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>
'웹 프로그래밍 > JSP' 카테고리의 다른 글
[JSP] jsp에서 .do (컨트롤러)로 파라미터 보내는 방법 2 가지 (0) | 2020.08.06 |
---|---|
[JSP] MultipartRequest를 이용한 파일 업로드 예제 (0) | 2020.07.27 |
[JSP] 해석 순서( jsp >> javascript ) : JSTL 등의 jsp 코드는 주석처리되어 화면에 안보임 (0) | 2020.07.23 |
[JSP] JSTL의 c 라이브러리 중 choose 태그를 사용하는 방법(if, else if, else) (0) | 2020.07.22 |
[JSP] form 태그 내의 값들을 조회하는 방법(document.formname.키.value) (0) | 2020.07.22 |