웹 파일 회원 업로드

메타플랫폼대표
|2024. 6. 27. 14:24
반응형
 

JavaBoardEx/2024_0627_PhotoGallery at main · chaSunil/JavaBoardEx

게시판연습. Contribute to chaSunil/JavaBoardEx development by creating an account on GitHub.

github.com

 

 

 

1. photo list form 작성

 

2. 만들어놨던 member 버튼 중에서 list.do를 photo list.do로 변경하는 작업

 

3. photo insert form 작성

 

 

 

 

 

 

Data Base 작성하기

-- 일련번호 관리객체 시퀀스 생성

create sequence seq_photo_idx

-- 테이블 생성

create table photo
(
	p_idx		int,					-- 일련번호
	p_title		varchar2(200) not null,	-- 제목
	p_content	varchar2(2000)not null,	-- 내용
	p_filename	varchar2(200) not null, -- 파일명
	p_ip		varchar2(100) not null, -- 아이피
	p_regdate	varchar2(100),			-- 등록일자
	mem_idx		int,					-- 작성자
	mem_name	varchar2(100) not null	-- 회원명
)

-- 기본키 설정

alter table photo
	add constraint pk_photo_idx primary key(p_idx);
	
-- 외래키

alter table photo
	add constraint fk_photo_mem_idx foreign key(mem_idx)
									references member(mem_idx)
-- 내가 참조할 키는 멤버 테이블에 있는 mem_idx를 가져올 것 입니다.

 

 

 

 

 

 

PhotoListAction 작성하기

package action.photo;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.PhotoDao;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoListAction
 */
@WebServlet("/photo/list.do")
public class PhotoListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		List<PhotoVo> list = PhotoDao.getInstance().selectList();
		request.setAttribute("list", list);

		// Dispatcher형식으로 호출
		String forward_page = "photo_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

 

 

VO 작성하기

package db.vo;

public class PhotoVo {

	int p_idx;
	String p_title;
	String p_content;
	String p_filename;
	String p_ip;
	String p_regdate;
	int mem_idx;
	String mem_name;
	
	public PhotoVo(String p_title, String p_content, String p_filename, String p_ip, int mem_idx, String mem_name) {
		super();
		this.p_title = p_title;
		this.p_content = p_content;
		this.p_filename = p_filename;
		this.p_ip = p_ip;
		this.mem_idx = mem_idx;
		this.mem_name = mem_name;
	}

	public PhotoVo() {
		// TODO Auto-generated constructor stub
	}
	
	public int getP_idx() {
		return p_idx;
	}
	public void setP_idx(int p_idx) {
		this.p_idx = p_idx;
	}
	public String getP_title() {
		return p_title;
	}
	public void setP_title(String p_title) {
		this.p_title = p_title;
	}
	public String getP_content() {
		return p_content;
	}
	public void setP_content(String p_content) {
		this.p_content = p_content;
	}
	public String getP_filename() {
		return p_filename;
	}
	public void setP_filename(String p_filename) {
		this.p_filename = p_filename;
	}
	public String getP_ip() {
		return p_ip;
	}
	public void setP_ip(String p_ip) {
		this.p_ip = p_ip;
	}
	public String getP_regdate() {
		return p_regdate;
	}
	public void setP_regdate(String p_regdate) {
		this.p_regdate = p_regdate;
	}
	public int getMem_idx() {
		return mem_idx;
	}
	public void setMem_idx(int mem_idx) {
		this.mem_idx = mem_idx;
	}
	public String getMem_name() {
		return mem_name;
	}
	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}
	
	
	
}

 

 

 

DAO 작성하기

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import db.vo.PhotoVo;
import service.DBService;

public class PhotoDao {

	// single-ton pattern : 객체 1개만 생성해서 사용하자
	static PhotoDao single = null;

	public static PhotoDao getInstance() {
		// 없으면 생성해라
		if (single == null) {
			single = new PhotoDao();
		}
		return single;
	}

	private PhotoDao() {

	}
	
	public List<PhotoVo> selectList() {
		List<PhotoVo> list = new ArrayList<PhotoVo>();

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		String sql = "select * from photo order by p_idx desc";

		try {
			// 1. Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			// 2. PreparedStatement
			pstmt = conn.prepareStatement(sql);

			// 3. ResultSet 얻어오기(킵해놨던 sql문 출력하기)
			rs = pstmt.executeQuery();

			while (rs.next()) {
				// 1. rs가 가리키는 레코드의 값을 읽어온다

				// 2. 저장객체 생성 -> 레코드에서 읽은 값을 넣는다.
				PhotoVo vo = new PhotoVo();

				// rs가 가리키는 레코드값을 VO에 넣는다.
				vo.setP_idx(rs.getInt("p_idx"));
				vo.setP_title(rs.getString("p_title"));
				vo.setP_content(rs.getString("p_content"));
				vo.setP_filename(rs.getString("p_filename"));
				vo.setP_ip(rs.getString("p_ip"));
				vo.setP_regdate(rs.getString("p_regdate"));
				vo.setMem_idx(rs.getInt("mem_idx"));
				vo.setMem_name(rs.getString("mem_name"));

				// ArrayList에 추가
				list.add(vo);

			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// 예외 처리에서 무조건 실행되는 부분
			// 마무리 작업(열린역순으로 닫기)
			// 한 번에 잡아서 try catch 하기 : alt + shift + s
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return list;
	}
	
	// 하나의 정보만 가져올 때 (where 사용해서 ex)deptno=10)
	public PhotoVo selectOne(int p_idx) {
		PhotoVo vo = null;

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		String sql = "select * from photo where p_idx=?";

		try {
			// 1. Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			// 2. PreparedStatement
			pstmt = conn.prepareStatement(sql);

			// 3. pstmt parameter index 채우기
			pstmt.setInt(1, p_idx);

			// 4. ResultSet 얻어오기(킵해놨던 sql문 출력하기)
			rs = pstmt.executeQuery();

			// while문을 사용해도 되지만, 공회전이 1회더 발생한다.
			if (rs.next()) {
				// 1. rs가 가리키는 레코드의 값을 읽어온다
				vo.setP_idx(rs.getInt("p_idx"));
				vo.setP_title(rs.getString("p_title"));
				vo.setP_content(rs.getString("p_content"));
				vo.setP_filename(rs.getString("p_filename"));
				vo.setP_ip(rs.getString("p_ip"));
				vo.setP_regdate(rs.getString("p_regdate"));
				vo.setMem_idx(rs.getInt("mem_idx"));
				vo.setMem_name(rs.getString("mem_name"));

				// 2. 저장객체 생성 -> 레코드에서 읽은 값을 넣는다.
				vo = new PhotoVo();

				// rs가 가리키는 레코드값을 VO에 넣는다.

			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// 예외 처리에서 무조건 실행되는 부분
			// 마무리 작업(열린역순으로 닫기)
			// 한 번에 잡아서 try catch 하기 : alt + shift + s
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return vo;
	}
	
	public int insert(PhotoVo vo) {
		// TODO Auto-generated method stub

		int res = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;

		String sql = "insert into photo values(seq_photo_idx.nextVal,?,?,?,?,sysdate,?,?)";

		try {
			// 1. Connection 얻어오기
			conn = DBService.getInstance().getConnection();

			// 2. PreparedStatement
			pstmt = conn.prepareStatement(sql);

			// 3. pstmt parameter index 채우기
			pstmt.setString(1, vo.getP_title());
			pstmt.setString(2, vo.getP_content());
			pstmt.setString(3, vo.getP_filename());
			pstmt.setString(4, vo.getP_ip()) ;
			pstmt.setString(5, vo.getP_regdate());
			pstmt.setInt(5, vo.getMem_idx()) ;
			pstmt.setString(6, vo.getMem_name());

			// 4. DB insert
			res = pstmt.executeUpdate();

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// 예외 처리에서 무조건 실행되는 부분
			// 마무리 작업(열린역순으로 닫기)
			// 한 번에 잡아서 try catch 하기 : alt + shift + s
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return res;

	}// end:insert()
	
}

 

 

 

 

Photo list 작성하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">

@font-face {
    font-family: 'MabinogiClassicR';
    src: url('https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_2207-01@1.0/MabinogiClassicR.woff2') format('woff2');
    font-weight: normal;
    font-style: normal;
}

* {
	font-family: 'MabinogiClassicR';
}

#background {
	background: url(../images/maul.png) no-repeat 100% 0 fixed;
	background-size: cover;
}

#box {
	width: 800px;
	margin: auto;
}

#title {
	display: block;
	margin: auto;
	margin-bottom: 50px;
	width: 250px;
}

#photo-box {
	height: 470px;
	background-color: white;
	border: 2px solid black;
	margin-top: 10px;
	/* 상하스크롤 */
	overflow-y: scroll;
	
}

.photo {
	width: 140px;
	height: 160px;
	border: 1px solid gray;
	overflow: hidden;
	margin-left: 45px;
	margin-top: 50px;
	padding: 10px;
	
	float: left;
}

.photo:hover {
	border-color: green;
}

.photo > img {
	height: 110px;
	width: 120px;
	object-fit : cover;
	border: 1px solid black;
}

.title {
	border: 1px solid gray;
	padding: 1px;
	margin-top: 5px;
	text-align: center;
}
</style>

<script type="text/javascript">

	function photo_insert() {
		
		// 로그인 체크(로그인이 안된 경우)
		if("${ empty user }"=="true") {
			if (confirm("사진올리기는 로그인 하신 후 이용이 가능합니다.\n로그인 하시겠습니까?")==false) {
				return;
			} else {
				location.href="../member/login_form.do";
				return;
			}
			
		}
		// 로그인이 된 경우 => 사진등록폼으로 이동
		location.href="insert_form.do"; // PhotoInsertFromAction
	}

</script>

</head>
<body>
	<div id="background">
	<div id="box">
		<img id="title" alt="" src="../images/maplelogo.png">
		<div class="row">
		  <div class="col-sm-6">
		  	<input class="btn btn-primary" type="button" value="사진올리기" onclick="photo_insert();">
		  </div>
		  <div class="col-sm-6" style="text-align: right;">
		  	<!-- 로그인이 안된 경우 -->
		  	<c:if test="${empty user}">
		  	<input class="btn btn-info" type="button" value="회원가입" onclick="location.href='../member/insert_form.do'">
		  	<input class="btn btn-primary" type="button" value="로그인" onclick="location.href='../member/login_form.do'">
		  	</c:if>
		  	
		  	<!-- 로그인이 된 경우 -->
		  	<c:if test="${not empty user}">
		  	<b>${user.mem_name}</b>님 환영합니다.
		  	<input class="btn btn-primary" type="button" value="로그아웃" onclick="location.href='../member/logout.do'">
		  	</c:if>
		  </div>
		</div>
	
	<div id="photo-box">
	
	<c:forEach var="vo" items="${list}">
		<div class="photo">
			<img src="../images/${vo.p_filename}">
			<div class="title">${vo.p_title}</div>
		</div>
	</c:forEach>
	</div>

	</div>
	</div>
</body>
</html>

 

 

 

loginFormAction

package action.member;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MemberLoginFormAction
 */
@WebServlet("/member/login_form.do")
public class MemberLoginFormAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Dispatcher형식으로 호출
		String forward_page = "member_login_form.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

 

 

MemberLoginAction

package action.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dao.MemberDao;
import db.vo.MemberVo;

/**
 * Servlet implementation class MemberLoginAction
 */
@WebServlet("/member/login.do")
public class MemberLoginAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 로그인 후 다른 화면으로 가야하기에, redirect 해준다.
		// login.do?mem_id=dad&mem_pwd=dad
		
		// 0. 수신인코딩 설정하기
		request.setCharacterEncoding("utf-8");
		// 1. parameter 받기
		String mem_id = request.getParameter("mem_id");
		String mem_pwd = request.getParameter("mem_pwd");
		// 2. mem_id를 이용해서 Me mberVo를 얻어온다
		MemberVo user = MemberDao.getInstance().selectOne(mem_id);
		
		if(user==null) { // 아이디가 없는(틀린) 경우
			// 아이디가 틀렸으니 reason=fail_id라고 값을 다시 보내준다.
			//					 Session Tracking 방법 중 하나 (GET)
			response.sendRedirect("login_form.do?reason=fail_id");
			return;
		}
		
		// 비밀번호가 틀린 경우
		if(user.getMem_pwd().equals(mem_pwd)==false) {
			response.sendRedirect("login_form.do?reason=fail_pwd&mem_id=" + mem_id);
			return;
		}
		
		// 로그인 완료시 : 현재 로그인된 객체(user)정보를 session에 저장
		HttpSession session = request.getSession();
		// user안에는 name,id,pwd등등 모든 정보가 들어있는 객체가 들어있다.
		session.setAttribute("user", user);
		
		// 현재경로 : /member/login.do
		
		// main 페이지 이동
		response.sendRedirect("../photo/list.do");

	}

}

 

 

 

Member_login_form.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>
<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.7.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<style type="text/css">
	#box {
		width: 400px;
		margin: auto;
		margin-top: 200px;
	}
	
	input[type="button"] {
		width: 100px;
	}
</style>
<script type="text/javascript">

	function send(f) {
		
		let mem_id = f.mem_id.value.trim();
		let mem_pwd = f.mem_pwd.value.trim();
		
		if(mem_id=="") {
			alert("아이디를 입력해주세요");
			f.mem_id.value="";
			f.mem_id.focus();
			return;
		} else if(mem_pwd=="") {
			alert("비밀번호를 입력해주세요");
			f.mem_pwd.value="";
			f.mem_pwd.focus();
			return;
		}
		
		f.action = "login.do"; // MemberLoginAction
		f.submit();
		
	}// end:send()

</script>

<script type="text/javascript">
	// 이 안에 있는 html이 전부 호출이 될 때 실행이 된다.
	// javascript 초기화
	// window.onload = function(){};
	
	// jQuery 초기화
	$(document).ready(function(){
		
		// showMessage(); 이렇게 바로 사용하면 하얀 화면에서 메세지가 나와서 이상하다.
		setTimeout(showMessage, 100); // 0.1초후에 메시지 띄워라
		
	});
	
	function showMessage(){
		// login_form.do?reason=fail_id
		// JSP el 사용
		if("${ param.reason == 'fail_id' }" == "true"){
			alert("아이디가 틀립니다.");
		}
		if("${ param.reason == 'fail_pwd' }" == "true"){
			alert("비밀번호가 틀립니다.");
		}
		
		if("${ param.reason == 'session_timeout'}" == "true") {
			alert("시간이 경과되어, 로그아웃 되었습니다.\n로그인 후 다시 등록하세요.");
		}
	}

</script>



</head>
<body>
<form>
	<div id="box">
		<div class="panel panel-primary">
    		<div class="panel-heading"><h5>로그인</h5></div>
    		<div class="panel-body">
    			<table class="table">
    				<tr>
    					<th>아이디</th>
    					<!-- form parameter -->
    					<td><input class="form-control" name="mem_id" value="${ param.mem_id }"></td>
    				</tr>
    				<tr>
    					<th>비밀번호</th>
    					<!-- form parameter -->
    					<td><input class="form-control" type="password" name="mem_pwd"></td>
    				</tr>
    				<tr>
    					<td colspan="2" align="center">
    						<input class="btn btn-success" type="button" value="메인화면" onclick="location.href='../photo/list.do'">
    						<input class="btn btn-primary" type="button" value="로그인" onclick="send(this.form)">
    					</td>
    				</tr>
    			</table>
    		</div>
    	</div>
	</div>
</form>
</body>
</html>

 

 

 

MemberLogoutAction

package action.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class MemberLogoutAction
 */
@WebServlet("/member/logout.do")
public class MemberLogoutAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Dispatcher형식으로 호출
		HttpSession session = request.getSession();
		session.removeAttribute("user");
		response.sendRedirect("../photo/list.do");

	}

}

 

 

 

MemberInsertFormAction

package action.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.MemberDao;
import db.vo.MemberVo;

/**
 * Servlet implementation class MemberInsertAction
 */
@WebServlet("/member/insert.do")
public class MemberInsertAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 수신인코딩 설정하기
		request.setCharacterEncoding("utf-8");
		
		String mem_name = request.getParameter("mem_name");
		String mem_id = request.getParameter("mem_id");
		String mem_pwd = request.getParameter("mem_pwd");
		String mem_zipcode = request.getParameter("mem_zipcode");
		String mem_addr = request.getParameter("mem_addr");
		String mem_ip = request.getRemoteAddr();
		
		MemberVo vo = new MemberVo(mem_name, mem_id, mem_pwd, mem_zipcode, mem_addr, mem_ip);
		
		int res = MemberDao.getInstance().insert(vo);
		
		response.sendRedirect("../photo/list.do");
		
		
		
	}
}

 

 

 

PhotoInsertFormAction

package action.photo;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class PhotoInsertFormAction
 */
@WebServlet("/photo/insert_form.do")
public class PhotoInsertFormAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Dispatcher형식으로 호출
		String forward_page = "photo_insert_form.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

 

 

PhotoInsertFormAction

package action.photo;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import dao.PhotoDao;
import db.vo.MemberVo;
import db.vo.PhotoVo;

/**
 * Servlet implementation class PhotoInsertAction
 */
@WebServlet("/photo/insert.do")
public class PhotoInsertAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// photo/insert.do?p_title=제목&p_content=내용&photo=notebook.png
		// 30분이 지나면 글못올리게 만들어야함
		// 로그인 상태 체크
		HttpSession session = request.getSession();
		
		MemberVo user = (MemberVo) session.getAttribute("user");
		// session timeout
		if(user==null) {
			response.sendRedirect("../member/login_form.do?reason=session_timeout");
			return;
		}
		
		// 유저정보 얻어오기
		int mem_idx = user.getMem_idx();
		String mem_name = user.getMem_name();
		
		// 파일업로드 처리
		String webPath = "/images/"; // 웹(url)경로
		
		// 현재 웹어플리케이션의 전역관리객체(상대경로->절대경로)
		ServletContext application = request.getServletContext();
		// 				  웹(상대경로)->절대경로
		String saveDir = application.getRealPath(webPath);
		int maxSize = 1024 * 1024 * 100;	// 최대업로드크기(100MB)
		//FileUpload 객체 => MultipartRequest
		MultipartRequest mr = new MultipartRequest(
											request,		// request 위임
											saveDir,		// 저장위치
											maxSize,		// 최대업로드크기
											"utf-8",		// 수신인코딩
											// 파일이름이 동일할 경우 다른이름으로 변경
											new DefaultFileRenamePolicy()
											);
		// 업로드 파일명을 얻어온다.
		String filename = "no_file";
		// mr에 의해서 업로드된 파일정보 얻어온다.
		File f = mr.getFile("photo");
		
		if(f!=null) { // 업로드 파일이 존재하면
			filename = f.getName();
		}
		
		// p_title 다른 parameter는 mr로 수신해야 한다. request 위임 했기 때문이다.
		String title = mr.getParameter("p_title");
		String p_content = mr.getParameter("p_content").replaceAll("\n","<br>");
		
		// parameter 외에 정보를 처리할 때는 request를 사용해준다.
		String p_ip = request.getRemoteAddr();
		// PhotoVo 포장
		PhotoVo vo = new PhotoVo(title, p_content, filename, p_ip, mem_idx, mem_name);
		// DB Insert
		int res = PhotoDao.getInstance().insert(vo);
		// 메인화면 이동
		response.sendRedirect("list.do");

	}

}

 

 

 

PhotoInsertForm.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>

<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.7.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">
@font-face {
    font-family: 'MabinogiClassicR';
    src: url('https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_2207-01@1.0/MabinogiClassicR.woff2') format('woff2');
    font-weight: normal;
    font-style: normal;
}

* {
    font-family: "MabinogiClassicR";
}

#title {
	text-align: center;
	font-size: 28px;
	
	margin-bottom: 60px
}

#box {
	width: 600px;
	margin: auto;
	margin-top: 100px;
}

textarea {
	resize: none;
}

th {
	vertical-align: middle !important;
	width: 15%;
}
</style>

<script type="text/javascript">

	function send(f) {
		
		// 입력값 검증
		let p_title = f.p_title.value.trim();
		let p_content = f.p_content.value.trim();
		let photo = f.photo.value;
		
		if(p_title=='') {
			alert("제목을 입력하세요!")
			f.p_title.value = "";
			f.p_title.focus();
			return;
		}
		if(p_content=='') {
			alert("내용을 입력하세요!")
			f.p_content.value = "";
			f.p_content.focus();
			return;
		}
		if(photo=='') {
			alert("사진을 선택하세요!")
			return;
		}
		
		f.action = "insert.do";// 전송대상(PhotoInsertAction)
		f.submit();
	}

</script>

</head>
<body>
	<form method="POST" enctype="multipart/form-data">
		<div id="box">
			<h1 id="title">여러분의 방문을 환영합니다.</h1>
			<!-- Ctrl + Shift + F -->
			<div class="panel panel-primary">
				<div class="panel-heading"><h4>사진올리기</h4></div>
				<div class="panel-body">
					<table class="table">
						<tr>
							<th>제목</th>
							<td><input class="form-control" name="p_title" autofocus></td>
						</tr>
						
						<tr>
							<th>내용</th>
							<td>
								<textarea class="form-control" rows="6" name="p_content"></textarea>
							</td>
						</tr>
						
						<tr>
							<th>사진</th>
							<td><input class="form-control" type="file" name="photo" required="required"></td>
						</tr>
						
						<tr>
							<td colspan="2" align="center">
								<input class="btn btn-success" type="button" value="메인화면"
									onclick="location.href='list.do'">
								<input class="btn btn-primary" type="button" value="사진올리기"
									onclick="send(this.form)">
							</td>
						</tr>
					</table>
				</div>
			</div>
		</div>
	</form>
</body>
</html>

 

 

 

톰캣 9.0 설정

 

 

반응형