일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Daemon()
- 상관 서브 쿼리
- StringReader
- StringWriter
- include 지시자
- MemoryStream
- ObjectInputStream
- Linux셋팅
- ID중복
- first-of-child
- sleep()메소드
- include지시자
- char[] String 형변환
- include액션태그
- 상관서브쿼리
- interrupted()
- ThreadGroup()
- 리눅스셋팅
- InputDialog
- interrupt()
- Linux세팅
- 메모리스트림
- 스레드그룸
- 리눅스세팅
- String char[] 형변환
- 표현 언어
- 동기화
- first-child
- 아이디중복
- isinterrupted()
- Today
- Total
다연이네
[days12] 파일을 업로드, 수정, 삭제하는 게시판 본문
클라이언트 -업로드-> 서버
<-다운로드-
1) 업로드 방법
ㄱ. input type='file' 서버에 올리고자하는 입력 태그 필요 +여러개면 jquery로 동적으로 태그 생성
ㄴ. method='post' enctype='multipart/form-data' (주의)
=> request객체로 파라미터 사용 불가
ㄷ. request.getInputStream() 개발자가 직접 구현 x(개념만 알기)
외부 라이브러리 사용 - cos.jar
서블릿 3.0이상 - 제공
+ 회원가입 [][][] 사진 업로드할때 페이지는 이동하지 않고 이 상황에서 사진만 업로드해야 할 경우
Ajax를 사용해 파일을 업로드할 수 있어야 한다.
2) DB 테이블 생성 후 파일 업로드
ㄱ. web.xml 복붙 - web20210111_days11.xml
ㄴ. days12 > ex01.jsp, write.jsp, list.jsp
days12 패키지 추가
ㄷ. FILETEST 테이블
SEQ_FILETEST 시퀀스 생성
create table filetest(
num number not null primary key
, subject varchar2(50) not null
, filesystemname varchar2(100) -- 실제 저장되는 파일명 a1.txt
, originalfilename varchar2(100) -- 저장할 때 파일명 a.txt
, filelength number -- 파일크기
);
create sequence seq_filetest;
ㄹ. MVC 패턴
C - FileTestController
commandHandlerMap map; <key(요청url), value(실제 집어넣는 작업)
init(){ }
list. do=?Handler 모델 X ~~~. properties X
ㅁ. days12. FileTestDTO. java
ㅂ. days12. FileTestDAO. java
ㅅ. write. do -> write. jsp -> list. do
write_ok. do -> 서버 파일 업로드 + FileTest 테이블 insert list. jsp
ex01.jsp
<%@ page 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>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
$(document).ready(function (){
});
</script>
</head>
<body>
<a href="/jspPro/days12/write.do">write.do</a> <br>
<a href="/jspPro/days12/list.do">list.do</a> <br>
</body>
</html>
web.xml 추가
<servlet>
<servlet-name>FileController</servlet-name>
<servlet-class>days12.FileTestController</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FileController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
FileTestController
package days12;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.oreilly.servlet.multipart.FileRenamePolicy;
import com.util.ConnectionProvider;
import com.util.JdbcUtil;
public class FileTestController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException {
String uri = request.getRequestURI();
Connection con = null;
try {
con = ConnectionProvider.getConnection();
String saveDirectory = request.getRealPath("/days12/upload");
System.out.println( saveDirectory );
//저장할 경로가 없다면 만들어라
File saveDir = new File( saveDirectory );
if( !saveDir.exists() ) saveDir.mkdirs();
FileTestDAO dao = FileTestDAO.getInstance();
if( uri.indexOf("list.do") != -1) {
ArrayList<FileTestDTO> list= dao.selectFileList(con);
request.setAttribute("list", list);
String path = "/days12/list.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
}else if( uri.indexOf("write.do") != -1) {
RequestDispatcher dispatcher = request.getRequestDispatcher("/days12/write.jsp");
dispatcher.forward(request, response);
}else if( uri.indexOf("write_ok.do") != -1) {
//String saveDirectory = pageContext.getServletContext().getRealPath("/days11/cos/upload");
//String saveDirectory = request.getRealPath(path); 위로 빼기
// 기본단위 byte
int maxPostSize = 5 * 1024 * 1024 ; // 5MB
String encoding = "UTF-8";
FileRenamePolicy policy = new DefaultFileRenamePolicy(); // Setup1.log
MultipartRequest mrequest = new MultipartRequest(
request
, saveDirectory
, maxPostSize
, encoding
, policy
);
//첨부파일이 있다면 벌써 저장 완료
String subject = mrequest.getParameter("subject");
//FileTestDAO dao = FileTestDAO.getInstance(); 밖으로 빼자
FileTestDTO dto = new FileTestDTO();
dto.setSubject(subject); //얘는 파일 정보 유무에 상관없이 들어가고
File uploadFile = mrequest.getFile("attachFile");
if(uploadFile!=null) { //첨부파일이 있다면 dto안에 정보를 담자
String fileName = uploadFile.getName();
long fileLength = uploadFile.length();
String originalFileName = mrequest.getOriginalFileName("attachFile");
String filesystemName = mrequest.getFilesystemName("attachFile");
dto.setFilelength(fileLength);
dto.setFilesystemname(filesystemName);
dto.setOriginalfilename(originalFileName);
}
int rowCount = dao.insert(con, dto);
response.sendRedirect("list.do");
}else if(uri.indexOf("delete.do") != -1) {
//1. 첨부된 파일이 있을경우 첨부파일도 삭제
//2. 게시글도 삭제
//delete.do?num=1 DB select 첨부파일 유뮤 확인 후
//delete.do?num=1&filesystemname=name
int num = Integer.parseInt(request.getParameter("num"));
String filesystemname = request.getParameter("filesystemname");
String pathname = String.format("%s%s%s", saveDirectory, File.separator, filesystemname);
//시스템마다 구분자가 다를 수 있다 (리눅스 등 ) /줘도 되나 File.separator로 주자
File deleteFile = new File(pathname);
if(deleteFile.exists()) {
deleteFile.delete();
}
int rowCount = dao.delete(con,num);
response.sendRedirect("/jspPro/days12/list.do");
}else if(uri.indexOf("update.do") != -1) {
//update.do?num=글번호[&filesystemname=파일명]
int num = Integer.parseInt(request.getParameter("num"));
FileTestDTO dto = dao.selectOne(con, num);
request.setAttribute("dto", dto);
//write.jsp 복붙해서 이름 변경
String path = "/days12/update.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
}else if(uri.indexOf("update_ok.do") != -1) {
//수정할 글번호 num 첨부파일 존재
// 제목수정, 첨부파일 안건들이기
// 제목 수정, 첨부파일 수정
//제목만 수정한 경우 첨부파일은 그대로 두고 제목만 업데이트
//제목, 파일 수정한 경우 제목 업데이트+ 기존파일 삭제 + 새 파일 추가
// list.do 이동
//제목만 수정한 경우
//제목+첨부파일 수정한 경우
//첨부파일만 수정한 경우
int maxPostSize = 1024*1024*5;
String encoding = "UTF-8";
FileRenamePolicy policy = new DefaultFileRenamePolicy();
MultipartRequest mrequest
= new MultipartRequest(request, saveDirectory
, maxPostSize, encoding, policy);
// 첨부 파일이 있다면 자동 업로드 완료됨.....................
FileTestDTO dto = new FileTestDTO();
int num = Integer.parseInt( mrequest.getParameter("num") ); // 글번호
dto.setNum( num );
dto.setSubject(mrequest.getParameter("subject"));
File uploadFile = mrequest.getFile("attachFile");
if( uploadFile != null ) { // 첨부파일이 있는 경우에만.
long uploadFile_length = uploadFile.length();
String originalfilename = mrequest.getOriginalFileName("attachFile");
String filesystemname = mrequest.getFilesystemName("attachFile");
dto.setFilelength(uploadFile_length);
dto.setFilesystemname(filesystemname);
dto.setOriginalfilename(originalfilename);
// 첨부된 파일이 있다면 이전 첨부파일은 삭제 코딩 추가...
String delete_filesystemname = mrequest.getParameter("filesystemname");
String deleteFilePath = String.format("%s%s%s", saveDirectory, File.separator,delete_filesystemname);
File deleteFile = new File(deleteFilePath);
if( deleteFile.exists() ) deleteFile.delete();
}else {
dto = dao.selectOne(con, num);
dto.setSubject(mrequest.getParameter("subject"));
}
int result = dao.update(con, dto);
// list.do 포워딩....
response.sendRedirect("list.do");
}
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(con);
}
}
@Override
protected void doPost(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
FileTestDAO.java
package days12;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.util.JdbcUtil;
public class FileTestDAO {
private static FileTestDAO dao = null;
private FileTestDAO() {}
public static FileTestDAO getInstance() {
if(dao==null) {
dao = new FileTestDAO();
}
return dao;
}
//예외 떠넘기지 않고 처리하자 (떠넘기면 컨트롤러에서 처리해야하는데 그럼 컨트롤러가 지저분해지고 자기 역할이 아님)
public int insert(Connection conn, FileTestDTO dto) {
int result = 0;
String sql = "insert into filetest "
+" (num, subject, filesystemname, originalfilename, filelength ) "
+" values "
+" ( seq_filetest.nextval , ?, ? ,? , ?) ";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getSubject());
pstmt.setString(2, dto.getFilesystemname());
pstmt.setString(3, dto.getOriginalfilename());
pstmt.setLong(4, dto.getFilelength());
result = pstmt.executeUpdate();
}catch(Exception e) {
System.out.println("> dao.insert() : " + e.toString());
}finally {
try { pstmt.close(); } catch (SQLException e) {e.printStackTrace(); }
}
return result;
}
public ArrayList<FileTestDTO> selectFileList(Connection conn){
ArrayList<FileTestDTO> list = null;
String sql =
" select num, subject, filesystemname, originalfilename, filelength "
+" from filetest "
+" order by num desc ";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
FileTestDTO dto = null;
if (rs.next()) {
list = new ArrayList<FileTestDTO>();
do {
dto = new FileTestDTO();
dto.setNum(rs.getInt("num"));
dto.setSubject( rs.getString("subject"));
dto.setFilesystemname(rs.getString("filesystemname"));
dto.setOriginalfilename(rs.getString("originalfilename"));
dto.setFilelength(rs.getLong("filelength"));
list.add(dto);
} while (rs.next());
} //
}catch(Exception e) {
System.out.println("> dao.insert() : " + e.toString());
}finally {
try { pstmt.close(); } catch (SQLException e) {e.printStackTrace(); }
}
return list;
}
public int delete(Connection conn, int num) {
int result = 0;
String sql = "delete from filetest where num = ?";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(pstmt);
}
return result;
}
public FileTestDTO selectOne(Connection con, int num) {
String sql =
" select num, subject, filesystemname, originalfilename, filelength "
+" from filetest "
+" where num = ? ";
PreparedStatement pstmt = null;
ResultSet rs = null;
FileTestDTO dto = null;
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if( rs.next()) {
dto = new FileTestDTO();
dto.setNum(rs.getInt("num"));
dto.setSubject( rs.getString("subject"));
dto.setFilesystemname(rs.getString("filesystemname"));
dto.setOriginalfilename(rs.getString("originalfilename"));
dto.setFilelength(rs.getLong("filelength"));
}
}catch(Exception e) {
System.out.println("> dao.insert() : " + e.toString());
}finally {
JdbcUtil.close(pstmt);
JdbcUtil.close(rs);
}
return dto;
}
public int update(Connection conn, FileTestDTO dto) {
int result = 0;
String sql = " update filetest "
+ " set subject=?,filesystemname=?,originalfilename=?,filelength=? "
+ " where num = ?";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getSubject());
pstmt.setString(2, dto.getFilesystemname());
pstmt.setString(3, dto.getOriginalfilename() );
pstmt.setLong(4, dto.getFilelength());
pstmt.setInt(5, dto.getNum() );
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(pstmt);
}
return result;
}
}//class
list.jsp
<%@ page 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>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
$(document).ready(function (){
});
</script>
</head>
<body>
<h3 style="text-align:center">FileList - list.jsp</h3>
<table style="width:600px" border="1" align="center">
<tr>
<td align="right" colspan="4">
<a href="write.do">WRITE</a>
</td>
</tr>
<tr>
<td align="center" width="50">글번호</td>
<td align="left" >제목</td>
<td align="center" width="200">첨부파일</td>
<td align="center" width="50">삭제</td>
</tr>
<c:forEach items="${ list }" var="dto">
<tr>
<td align="center" width="50">${ dto.num }</td>
<td align="left" > ${ dto.subject }</td>
<td align="center" width="200">
<a href="/jspPro/days12/upload/${dto.filesystemname }"> ${ empty dto.originalfilename?"없음" :dto.originalfilename }</a>
</td>
<td align="center" width="50">
<a href="delete.do?num=${ dto.num }&filesystemname=${dto.filesystemname}">삭제</a>
<a href="update.do?num=${ dto.num }&filesystemname=${dto.filesystemname}">수정</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
update.jsp
<%@ page 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>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
$(document).ready(function (){
});
</script>
</head>
<body>
<h3 style="text-align: center">update.jsp</h3>
<form
action="update_ok.do?num=${dto.num }"
method="post"
enctype="multipart/form-data" >
<table border="1" style="width: 500px;" align="center">
<tr>
<td> subject </td>
<td> <input type="text" name="subject" value="${dto.subject }"/></td>
</tr>
<tr>
<td> attach file </td>
<td>
<input type="file" name="attachFile" />
<input type="text" name="filesystemname" value="${dto.filesystemname }" />
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
write.jsp
<%@ page 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>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="">
<style>
</style>
<script>
$(document).ready(function (){
});
</script>
</head>
<body>
<h3 style="text-align: center">write.jsp</h3>
<form
action="write_ok.do"
method="post"
enctype="multipart/form-data" >
<table border="1" style="width: 500px;" align="center">
<tr>
<td> subject </td>
<td> <input type="text" name="subject" /></td>
</tr>
<tr>
<td> attach file </td>
<td><input type="file" name="attachFile" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
'JSP' 카테고리의 다른 글
[days14] JSON 개요 (0) | 2021.01.14 |
---|---|
[days13] AJAX (0) | 2021.01.13 |
[days11] 파일 업로드 (0) | 2021.01.11 |
[days10] 코드 - 답글을 달 수 있는 게시판(==계층형 게시판==답변형 게시판) (0) | 2021.01.08 |
[days10] 이론 - 답글을 달 수 있는 게시판(==계층형 게시판==답변형 게시판) (1) | 2021.01.07 |