다연이네

[days12] 파일을 업로드, 수정, 삭제하는 게시판 본문

JSP

[days12] 파일을 업로드, 수정, 삭제하는 게시판

 다연  2021. 1. 12. 13:03
반응형

클라이언트 -업로드-> 서버 

            <-다운로드- 
       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>
반응형
Comments