무작정 개발.Vlog

[Servlet] 쿠키(cookie), 파일 업로드(1) - 파일 등록 및 조회, 파일 업로드(2) - 파일 업로드, 다운로드, 삭제

by 무작정 개발
반응형
2022.02.23(43일 차)

 

 

쿠키(Cookie)

  • 웹사이트에 접속할 때 생성되는 정보를 담은 임시파일
  • DB에 모든 데이터를 저장하지 않고, 클라이언트의 컴퓨터에 저장하는 것을 쿠키라고 한다.
  • 쿠키 정보를 저장할 때 한글의 경우 깨질 수 있어 인코딩 작업이 필요하다.

 

 

test 3.jsp에서 쿠키를 생성하고, 데이터를 test4.jsp로 보냄 -> test4.jsp에서 데이터를 받아 화면에 출력

 

test 3.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
	
	//쿠키 생성 - 쿠키는 클라이언트에서 생성해서 서버에 보냄
	
	Cookie c1 = new Cookie("name" , "inna"); //name이라는 변수에 inna를 저장
	Cookie c2 = new Cookie("age" , "40");
	Cookie c3 = new Cookie("addr" , "seoul");
	Cookie c4 = new Cookie("tel" , "010-123-1234");
	
	
	c1.setMaxAge(0); //쿠키가 바로 삭제됨
	c2.setMaxAge(-1); //쿠키가 끝까지 남아있음 -(삭제x)
	c3.setMaxAge(10); //10초 후 쿠키 삭제
	
	
	//response를 써서 서버에 응답하기
	response.addCookie(c1);
	response.addCookie(c2);
	response.addCookie(c3);
	response.addCookie(c4);
	
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<a href="test4.jsp">확인</a>

</body>
</html>

 

 

Cookie c1 = new Cookie("name" , "inna"); //name이라는 변수에 inna를 저장
Cookie c2 = new Cookie("age" , "40");
Cookie c3 = new Cookie("addr" , "seoul");
Cookie c4 = new Cookie("tel" , "010-123-1234");

먼저 위의 소스를 보면 쿠키를 생성해서 c1에  'name'이라는 변수에 'inna'를 저장한다. c2, c3, c4도 c1과 동일하다.

 

c1.setMaxAge(0); //쿠키가 바로 삭제됨
c2.setMaxAge(-1); //쿠키가 끝까지 남아있음 -(삭제x)
c3.setMaxAge(10); //10초 후 쿠키 삭제

setMaxAge는 쿠키가 화면에 남아있는 시간을 설정해주는데 ( ) 안에 0을 쓰면 쿠키가 바로 삭제되고, -1을 쓰면 끝까지

남아있고, 10을 쓰면 10초 후 쿠키가 삭제된다. 0과 -1을 제외하며 남아있는 시간을 '초'를 기준으로 해서 ( ) 안에 

써주면 된다.

c4는 test4에서 다른 쿠키를 덮어 씌운 예정이기에 따로 지정하지 않았다.

 

response.addCookie(c1);
response.addCookie(c2);
response.addCookie(c3);
response.addCookie(c4);

response로 클라이언트 컴퓨터로 쿠키를 보낸다.


test4.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
	
	//기존 쿠키 덮어씌운다
	Cookie c4 = new Cookie("tel", null);
	response.addCookie(c4);
	
	//쿠키는 배열로 받는다.
	Cookie[] c = request.getCookies();
	
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%

	if(c!=null) {
		
		for(Cookie ck : c) {
			
			out.print("쿠키이름: ");
			out.print(ck.getName());
			out.print(", 쿠키값: ");
			out.print(ck.getValue() + "<br/>");
		}
	}


%>

</body>
</html>

 

 

//기존 쿠키 덮어씌운다
Cookie c4 = new Cookie("tel", null);
response.addCookie(c4);
	
//쿠키는 배열로 받는다.
Cookie[] c = request.getCookies();

test 3.jsp에 c4 쿠키가 있었는데 여기에 새로운 쿠키를 덮어 씌우고 다시 데이터를 보낸다.

그리고 쿠키는 여러 개 이므로  배열로 받아준다.

 

 

<body>
<%
	if(c!=null) {
		
		for(Cookie ck : c) {
			
			out.print("쿠키이름: ");
			out.print(ck.getName());
			out.print(", 쿠키값: ");
			out.print(ck.getValue() + "<br/>");
		}
	}
%>
</body>

위의 <body> 부분을 보자

 

if(c!=null) --> 만약 c가 null이 아니면 즉, c(쿠키)가 있다면 확장 for문을 실행한다.

 

아까 우리는 name이라는 변수에 inna를 저장했다.

쿠키 생성 코딩의 괄호 앞부분이 name이고 뒤의 값이 value로 처리된다.

 

실행 결과

test3.jsp
test4.jsp

c1.setMaxAge(0); //쿠키가 바로 삭제됨
c2.setMaxAge(-1); //쿠키가 끝까지 남아있음 -(삭제x)
c3.setMaxAge(10); //10초 후 쿠키 삭제

결과에는 c1쿠키가 없다. 왜냐하면 c1.setMaxAge(0); 로 생성해서 쿠키가 생성하자마자 바로 삭제가 되기 때문이다.

c3인 tel도 10초 후 새로고침을 클릭하면 쿠키 값이 삭제된다.

 


파일 업로드(1) - 파일 등록 및 조회

 

cos.jar를 이용해서 파일 업로드를 할 예정이다. 

먼저 cos.lib를 설치한다.

http://www.servlets.com/cos/

 

Servlets.com | com.oreilly.servlet

 

www.servlets.com

경로
경로

위의 사진 경로에 cos.jar을 넣어주면 끝!

 

 

 

파일 업로드

 

파일 업로드는 물리적인 파일을 생성하는 방법, DB에 저장하는 방법 총 2가지로 나뉜다.

 

클라이언트 -> 서버로 파일을 업로드하기 위해서는

  1. 서버의 어디에 저장할 지의 '위치'
  2. 파일 경로가 존재하지 않을 시 '경로 만들기'
  3. 허용되는 '파일 크기'

를 설정해줘야 한다.

 

 

test 1에서 업로드할 파일을 선택해서 test 3으로 넘어가면서 데이터가 저장되고 파일 정보 출력하기

 

test 1.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();

%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일등록</title>
</head>
<body>

<form action="test3.jsp" method="post" enctype="multipart/form-data">

제목: <input type="text" name="subject"/><br/>
파일: <input type="file" name="upload"/><br/>
<input type="submit" value="전송"/>

</form>

</body>
</html>

전송 버튼을 누르면 submit을 통해 action이 실행되며 test 3.jsp로 넘어가고, enctpye = multipart를 써서

파일을 전송하겠다는 의미를 담음. 파일 type은 'file'로 설정한다.

 

test3.jsp

<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="java.io.File"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
	
	//위치, 경로, 사이즈 파일을 보낼때 알아두어야함 Context가 나오면 글로벌 모든 폴더와 파일에서 사용가능
	
	//서버 디폴트 경로
	String root = pageContext.getServletContext().getRealPath("/");
	
	//저장되는 위치와 폴더
	String path = root + "pds" + File.separator + "saveData"; //파일의 위치를 정하고.
	
	//String path = "c:\\pds\\saveData"; 위 대신 이렇게 적어도 된다.
	
	
	//저장 공간이 될 폴더가 없으면 폴더 생성
	File f = new File(path);
	if(!f.exists()){ //f 의 경로가 존재하지 않으면
		f.mkdirs(); //경로의 파일을 만들어라
	}
	
	//인코딩 타입
	String encType = "UTF-8";
	
	//최대 파일 크기 제한
	int maxFileSize = 10*1024*1024; //10메가바이트.
	
	try{
		
		//파일 업로드 - request파일을 path,maxFileSize,encType조건으로
		MultipartRequest mr =
			new MultipartRequest(request,path,maxFileSize,encType,
					new DefaultFileRenamePolicy()); //파일 업로드. 파일은 리퀘스트에 담겨서옴./경로/맥스사이즈
					
		
		//DB에 저장하기위해 파일 정보 추출
		
		out.print("제목: " + mr.getParameter("subject")+"<br/>"); //파일의 정보는 위의 mr에 들어가있다.
		out.print("서버에 저장된 파일 이름: " + 
			mr.getFilesystemName("upload") + "<br/>");
		out.print("업로드한 파일명: " +
			mr.getOriginalFileName("upload") + "<br/>");
		out.print("파일 타입: " + mr.getContentType("upload") + "<br/>");
		
		
		//파일 객체 생성
		File file = mr.getFile("upload");
		out.print("파일 크키: " + file.length() + "<br/>");
		
		
	}catch(Exception e){
		
	}
		
%>

 

 

 

//서버 디폴트 경로
String root = pageContext.getServletContext().getRealPath("/");
	
//저장되는 위치와 폴더
String path = root + "pds" + File.separator + "saveData"; //파일의 위치를 정하고.
	
//String path = "c:\\pds\\saveData"; 위 대신 이렇게 적어도 된다.

위의 소스를 보면 root는 위치를 자동으로 찾아가도록 해준다.

path에는 저장되는 파일 위치(경로)를 써주면서, root값을 넣어주고 폴더 명을 적어준다. 

위를 보면 pds 폴더 안에 saveData폴더를 경로로 지정한다. test 3.jsp에서 폴더명이 존재하지 않으면 폴더를 만들어주는

소스 또한 작성했다.

 

//DB에 저장하기위해 파일 정보 추출
out.print("제목: " + mr.getParameter("subject")+"<br/>"); //파일의 정보는 위의 mr에 들어가있다.
out.print("서버에 저장된 파일 이름: " + 
mr.getFilesystemName("upload") + "<br/>");
out.print("업로드한 파일명: " +
mr.getOriginalFileName("upload") + "<br/>");
out.print("파일 타입: " + mr.getContentType("upload") + "<br/>");

위의 소스를 보면  getFilesystemName, getOriginalFileName 2개가 있다. 이 2개의 차이점은 

2개의 파일을 업로드하는데 파일명이 같으면 혼란이 올 수 있기에  getOriginalFileName  실제 파일명이고, 

getFilesystemName는 같은 파일이 업로드되면 파일 1, 파일 2 식으로 서버에 저장되는 다른 이름이다.

 

자세한 건 하단 실행화면 참고!

 

 

test1.jsp실행화면

제목은 test로 해서 life cycle.txt 파일을 업로드할 것이다. 전송 버튼을 클릭하면 하단 화면이 출력된다.

 

test3.jsp실행화면 및 파일 업로드
test3.jsp실행화면 및 파일 업로드

위를 보면 pds 폴더 안에 saveData폴더가 생성되고 life cycle 파일이 업로드되었다. 

이제 같은 파일을 업로드해보겠다.

 

파일 중복 업로드
파일 중복 업로드

같은 파일을 업로드하면 뒤에 숫자를 붙여줘서 시스템이 인식하도록 서버에 저장되는 이름이다.

 


파일 업로드(2) - 파일 업로드, 다운로드, 삭제

 

이번에는 파일 업로드, 파일 다운로드, 파일 삭제를 해볼 것이다.

 

 

1. 먼저 fileTest DB 생성하기

fileTest 테이블 생성
fileTest 테이블 생성

 

테이블 생성
테이블 생성

테이블 생성 후 select로 잘 생성됐는지 확인하기

 

 

2. 서블릿 매핑 web.xml 설정

<!-- 서블릿 파일 업로드 -->
   <servlet>
  	<servlet-name>fileTestServlet</servlet-name>
  	<servlet-class>com.fileTest.FileTestServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>fileTestServlet</servlet-name>
  	<url-pattern>/file/*</url-pattern>
  </servlet-mapping>

 

 

3. FileTestDTO, DAO 생성

 

FileTestDTO.java

package com.fileTest;

public class FileTestDTO {
	
	private int num;
	private String subject;
	private String saveFileName;
	private String originalFileName;
    
    //getter/setter생성
    }

 

FileTestDAO.java

package com.fileTest;

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

public class FileTestDAO {

	private Connection conn = null;

	public FileTestDAO(Connection conn) {

		this.conn = conn;
	}

	public int getMaxNum() {

		int maxNum = 0;

		PreparedStatement pstmt = null;

		// select는 ResultSet이 필요
		ResultSet rs = null;
		String sql;

		try {

			sql = "select nvl(max(num),0) from fileTest";

			pstmt = conn.prepareStatement(sql);

			rs = pstmt.executeQuery();

			if (rs.next())
				maxNum = rs.getInt(1);

			rs.close();
			pstmt.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

		return maxNum;

	}

	public int insertData(FileTestDTO dto) {

		int result = 0;

		PreparedStatement pstmt = null;
		String sql;

		try {

			sql = "insert into fileTest (num,subject,saveFileName,";
			sql += "originalFileName) values (?,?,?,?)";

			pstmt = conn.prepareStatement(sql);

			pstmt.setInt(1, dto.getNum());
			pstmt.setString(2, dto.getSubject());
			pstmt.setString(3, dto.getSaveFileName());
			pstmt.setString(4, dto.getOriginalFileName());

			result = pstmt.executeUpdate();

			pstmt.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

		return result;

	}

	// 전체 데이터 읽어오기
	public List<FileTestDTO> getLists(int start, int end) {

		List<FileTestDTO> lists = new ArrayList<>();

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql;

		try {
			
			sql = "select * from ("; 
			sql+= "select rownum rnum, data.* from (";
			sql+= "select num,subject,saveFileName,originalFileName ";
			sql += "from fileTest order by num desc) data)";
			sql+= "where rnum>=? and rnum<=?";
			
			
			pstmt = conn.prepareStatement(sql);
			
			pstmt.setInt(1, start);
			pstmt.setInt(2, end);

			rs = pstmt.executeQuery();

			while (rs.next()) {

				FileTestDTO dto = new FileTestDTO();

				dto.setNum(rs.getInt("num"));
				dto.setSubject(rs.getString("subject"));
				dto.setSaveFileName(rs.getString("saveFileName"));
				dto.setOriginalFileName(rs.getString("originalFileName"));

				lists.add(dto);

			}

			rs.close();
			pstmt.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

		return lists;

	}

	// 하나의 데이터를 읽어옴
	public FileTestDTO getReadData(int num) { // 밑에서받아야하니 num으로

		FileTestDTO dto = null;

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql;

		try {

			sql = "select num,subject,saveFileName,originalFileName ";
			sql += "from fileTest where num=?";

			pstmt = conn.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.setSaveFileName(rs.getString("saveFileName"));
				dto.setOriginalFileName(rs.getString("originalFileName"));

			}
			rs.close();
			pstmt.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}
		return dto;

	}

	// 데이터 삭제
	public int deleteData(int num) {

		int result = 0;

		PreparedStatement pstmt = null;
		String sql;

		try {

			sql = "delete fileTest where num=?";

			pstmt = conn.prepareStatement(sql);

			pstmt.setInt(1, num);

			result = pstmt.executeUpdate();

			pstmt.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}

		return result;

	}

	// 전체 데이터 갯수 구하기
	public int getDataCount() {

		int totalCount = 0;

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql;

		try {

			sql = "select nvl(count(*),0) from fileTest ";

			pstmt = conn.prepareStatement(sql);

			rs = pstmt.executeQuery();

			if(rs.next()) {
				totalCount = rs.getInt(1);
			}

			rs.close();
			pstmt.close();

		} catch (Exception e) {
			System.out.println(e.toString());
		}
		return totalCount;
	}

}

 

 

4. FileTestServlet 서블릿 클래스 생성

package com.fileTest;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.util.List;

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.util.DBConn;
import com.util.FileManager;
import com.util.MyUtil;


// 파일은 삭제 추가 밖에 없다

public class FileTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		doPost(req, resp);
	}
	
	protected void forward(HttpServletRequest req, HttpServletResponse resp,String url) throws ServletException, IOException {
		
		RequestDispatcher rd = req.getRequestDispatcher(url);
		rd.forward(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		req.setCharacterEncoding("UTF-8");
		String cp = req.getContextPath();
		Connection conn = DBConn.getConnection();
		
		FileTestDAO dao = new FileTestDAO(conn);

		MyUtil myUtil = new MyUtil();
		
		String uri = req.getRequestURI();
		String url;
		
		// 파일 저장 경로
		String root = getServletContext().getRealPath("/"); // 글로벌
		String path = root + "pds" + File.separator + "saveFile";
		
		
		File f = new File(path); // 경로를 넘겨줌	
		if(!f.exists()) {
			f.mkdirs();
		}
		if(uri.indexOf("write.do")!=-1) {
			url = "/fileTest/write.jsp";
			forward(req, resp, url);
		
		} else if(uri.indexOf("write_ok.do")!=-1) {
			// 파일을 업로드 시키고 파일의 정보를 가져와서 db에 넣는다
			
			// 파일 업로드 작업
			String encType = "UTF-8";
			int maxSize = 10 * 1024 * 1024;
			
			MultipartRequest mr = 
					new MultipartRequest(req, path, maxSize, encType,
							new DefaultFileRenamePolicy());
			
			// 파일 정보 db에 저장
			// 파일 업로드가 실행이 안되면 이부분을 안해도됨
			// file/test3.jsp 내용
			if(mr.getFile("upload")!=null) {
				
				FileTestDTO  dto = new FileTestDTO();
				int maxNum = dao.getMaxNum(); // 최대값읽어옴
				
				dto.setNum(maxNum + 1);
				dto.setSubject(mr.getParameter("subject"));
				dto.setSaveFileName(mr.getFilesystemName("upload"));
				dto.setOriginalFileName(mr.getOriginalFileName("upload"));
			
				dao.insertData(dto);
			}
			// 리스트한테 넘기면 됨
			url = cp + "/file/list.do";
			resp.sendRedirect(url);
			
		} else if(uri.indexOf("list.do")!=-1) {
			
			String pageNum = req.getParameter("pageNum");
			
			int currentPage = 1;
			if(pageNum!=null) // pageNum이있으면 현재 페이지로 설정 
				currentPage = Integer.parseInt(pageNum);
			
			int dataCount = dao.getDataCount();
			int numPerPage = 5;
			int totalPage = myUtil.getPageCount(numPerPage,dataCount);
			
			int start = (currentPage-1)*numPerPage+1;//(2-1)*5+1=6(rnum)
			int end = currentPage*numPerPage; // 2 * 5 = 10(rnum)
			
			String listUrl = cp + "/file/list.do";
			
			// 전체 데이터를 가져오면 됨
			// lists는 사용자가 입력한 데이터가 나오게됨
			//List<FileTestDTO> lists = dao.getLists();

			start = (currentPage-1) * numPerPage + 1;
			end = currentPage * numPerPage;
			
			List<FileTestDTO> lists = dao.getLists(start,end); 	
			
			// article처럼 간단한 주소를 하나 만듬
			String deletePath = cp + "/file/delete.do";
			String downloadPath = cp + "/file/download.do";
			String imagePath = cp + "/pds/saveFile"; //이미지는 실제 주소를 써줘야함

			String pageIndexList =
					myUtil.pageIndexList(currentPage, totalPage, listUrl);
			
			
			req.setAttribute("pageIndexList", pageIndexList);
			req.setAttribute("dataCount", dataCount);
			
			
			// lists는 list.jsp로 포워딩되서 넘어감
			req.setAttribute("lists", lists);
			req.setAttribute("deletePath", deletePath);
			req.setAttribute("downloadPath", downloadPath);
			req.setAttribute("imagePath", imagePath);
			
			url = "/fileTest/list.jsp";
			forward(req, resp, url);
			
			
		// 파일삭제 db삭제 둘다 해야함	
		} else if(uri.indexOf("delete.do")!=-1) {
			
			// num 넘어옴
			int num = Integer.parseInt(req.getParameter("num"));
			
			FileTestDTO dto = dao.getReadData(num); // 하나의 데이터를 넘겨줌
			
			// 파일삭제(Myutil 에 doFileDelete 에 파일이름과 path를 넘겨주면 됨
			// 파일 매니저 있는걸 실행한다.
			// String path = root + "pds" + File.separator + "saveFile";
			FileManager.doFileDelete(dto.getSaveFileName(), path);
			
			// DB삭제 
			dao.deleteData(num);
			
			// 삭제를 했으니 리다이렉트 해줘야함 
			url = cp + "/file/list.do";
			resp.sendRedirect(url);
			
		} else if(uri.indexOf("download.do")!=-1) {
			
			int num = Integer.parseInt(req.getParameter("num"));
			
			FileTestDTO dto = dao.getReadData(num); // 하나의 데이터를 넘겨줌
			
			//한번 검증해줌( 안써도됨 큰 의미x)
			if(dto==null)
				return;
			
			boolean flag = 
					FileManager.doFileDounload(resp, 
							dto.getSaveFileName(), dto.getOriginalFileName(), path);
			
			
			if(flag==false) {
				
				resp.setContentType("text/html;charset=utf-8");
				PrintWriter out = resp.getWriter();
				
				out.print("<script type='text/javascript'>");
				out.print("alert('Download Error!!');");
				out.print("history.back();");
				out.print("</script>");
				
				
				
			}
			
		}
	}
}

 

 

5. FileManager.java - 파일 다운로드 & 삭제 메서드 생성 (매우 중요)

package com.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletResponse;

public class FileManager {
	
	/*
	파일 다운로드
	
	saveFileName : 서버에 저장된 파일명
	originalFileName : 클라이언트가 업로드한 파일명
	path : 서버에 저장된 실제 경로
	서버에 있는 파일을 읽어서 클라이언트에게 보내는 것이기 때문에 req가 아니라 resp가 매개변수로 사용
	
	*/
	
	
	public static boolean doFileDounload(HttpServletResponse response, String saveFileName,
			String originalFileName, String path) {
		
		
		try {
			
			//파일 경로
			String filePath = path + File.separator + saveFileName;
			
			//클라이언트가 설정한 파일명이 없을 경우 서버에 저장된 파일명으로 입력
			if(originalFileName==null||originalFileName.equals("")) {
				originalFileName = saveFileName; //검증
			}
		
			//파일을 다운받아 클라이언트 컴에 저장할때 한글이름 깨짐방지
			originalFileName = new String(originalFileName.getBytes("euc-kr"),"ISO-8859-1");//인코딩
			//ISO를 생략하고 써도 된다. 그때는 언더바를 써준다.
			
			File f = new File(filePath);
			
			//파일이 존재하지 않으면 stop
			if(!f.exists()) {
				return false;				
			}//여기를 통과한건 파일이 왔다는거. 다운로드는 아래 리스폰스
			
			//파일의 종류.ContentType를 설정
			// .txt와 같이 파일확장자 앞에 붙는.을 octet-stream이라고 함
			response.setContentType("application/octet-stream");
			
			//헤더 정보 - setHeader로 파일 다운로드가 되는 것을 보이게 하고, 파일명을 알려줌
			response.setHeader("Content-disposition", "attachment;fileName=" + originalFileName);
			
			//서버에서 클라이언트로 보낼 때 Fileinputstream으로 파일을 읽은 후 bis에 넣은 것
			//여기서 받은 정보는 인풋스트림으로 읽어서 아웃풋 스트림으로 내보낸다.
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
			
			//읽은 파일을 내보낼 때 outputstream 사용
			OutputStream out = response.getOutputStream();
			
			int data;
			byte[] bytes = new byte[4096]; 
			
			//byte를 0부터 데이터가 있는만큼 내보내라
			while((data=bis.read(bytes, 0, 4096))!=-1) {//바이트의 영번째, 부터 4096까지 읽어와라
				out.write(bytes,0,data);//데이터에 있는 내용을 다 읽어와라
				
			}
			
			out.flush(); //flush 닫기
			out.close();
			bis.close();
			
			
			
		} catch (Exception e) {
			System.out.println(e.toString());
			return false;
		}
		return true;
	}
	
	
	//파일삭제
	public static void doFileDelete(String fileName, String path) {//이름과 위치를 받아서
		
		try {
			
			String filePath = path + File.separator + fileName;
			
			File f = new File(filePath);
			//파일한테 넘겨줘요
			if(f.exists())
				f.delete(); // 물리적인 파일 삭제
			
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		
	}
	
	

}

 

 

위의 클래스 안에 있는 메서드는 파일을 다운로드해주는 메서드이다.

 

클라이언트가 서버에 데이터를 보낼 때 : request
서버가 클라이언트에게 데이터를 보낼 때 : response

파일을 다운로드하는 것은 서버에서 클라이언트에게 보내지는 것이기 때문에 response 쓴다.

자세한 건 위의 소스 주석 참고!

 

 

6. 파일 업로드 페이지 - write.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일 올리기</title>
</head>
<body>

<form action="<%=cp%>/file/write_ok.do" method="post" enctype="multipart/form-data">

제목: <input type="text" name="subject"/><br/>
파일: <input type="file" name="upload"/><br/>
<input type="submit" value="전송"/>
</form>

<input type="button" value=" 리스트 " 
	onclick="javascript:location.href='<%=cp%>/file/list.do';"/>



</body>
</html>

 

 

7. 파일 리스트 조회 페이지 - list.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일 리스트</title>
</head>
<body>

<table width="500" align="center">
<tr>
	<td align="right" colspan="4">
	<input type="button" value=" 글쓰기 " 
	onclick="javascript:location.href='<%=cp%>/file/write.do';"/>
	</td>
</tr>

<tr>
	<td align="center" width="50">번호</td>
	<td align="left" width="150">제목</td>
	<td align="left" width="250">파일명</td>
	<td align="center" width="50">삭제</td>
</tr>

<c:forEach var="dto" items="${lists }">
<tr>
	<td align="center" width="50">${dto.num }</td>
	<td align="left" width="150">${dto.subject }</td>
	<td align="left" width="250">
	
	 <a href="${downloadPath }?num=${dto.num} ">
	${dto.originalFileName }</a> 
	
	<a href= "${imagePath }/${dto.saveFileName }">
	<img src="${imagePath }/${dto.saveFileName }" width="180" height="180">
	</a>
	
	
	</td>
	<td align="center" width="50">
	<a href="${deletePath }?num=${dto.num}">
	삭제</a>
	</td>
</tr>
</c:forEach>

<tr>
	<td align="center" colspan="4">
	<c:if test="${dataCount != 0 }">
		${pageIndexList }
	</c:if>
	<c:if test="${dataCount == 0 }">
		등록된 파일이 없습니다.
	</c:if>
	</td>
</tr>

</table>

</body>
</html>

 

 

실행화면

파일 업로드 페이지

맥북 이모티콘. png파일을 선택 후 전송 버튼을 클릭해서 이미지를 업로드한다.

 

 

파일 리스트 조회 페이지
파일 리스트 조회 페이지

사이즈가 살짝 안 맞지만 성공적으로 올린 이미지가 업로드되었다.

DB에 데이터가 들어갔는지 확인
DB에 데이터가 들어갔는지 확인

DB를 조회해보니 성공적으로 데이터가 저장됐다.

 

 

파일 다운로드
파일 다운로드

이미지 위에 있는 맥북 이모티콘. png를 클릭하면 성공적으로 파일이 다운로드된다. 

 

 

삭제하기
삭제하기

이미지 우측 삭제 버튼을 클릭 시 DB와 list페이지에서 데이터가 삭제된다.

 


끝!

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기