본문 바로가기

서버/Servlet-JSP
[Servlet-JSP] 파일 업로드, 다운로드

//파일 조작

- 파일 업로드/다운로드를 위해서는 cos jar파일이 필요하다. (https://mvnrepository.com)

- <form> 태그에 enctype 속성을 추가해야 한다.

enctype="multipart/form-data"


- 업로드 주요 코드

String path = request.getRealPath("fileFolder");
int size = 1024 * 1024 * 100; 
String filename ="";
String orgfilename = "";

MultipartRequest multi = new MultipartRequest(request, path, size, "UTF-8", new DefaultFileRenamePolicy());

Enumeration e = multi.getFileNames();
while(e.hasMoreElements()) {
	String orgfilename = multi.getOriginalFileName(file);
    String filename = multi.getFilesystemName(file);
}

 

- 다운로드 주요 코드

String fileName = request.getParameter("filename");
String orgfileName = request.getParameter("orgfilename");
String savePath = "업로드폴더명";

ServletContext context = getServletContext();
String sDownloadPath = context.getRealPath(savePath);

String sFilePath = sDownloadPath + "/" + fileName;
byte b[] = new byte[4096];
FileInputStream in = new FileInputStream(sFilePath);
String sMimeType = getServletContext().getMimeType(sFilePath);

if (sMimeType == null){
	sMimeType = "application/octet-stream";
}

response.setContentType(sMimeType);
String agent = request.getHeader("User-Agent");
boolean ieBrowser = (agent.indexOf("MSIE") > -1) || (agent.indexOf("Trident") > -1);

if (ieBrowser) {
	fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("/+", "%20");
} else {
	fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
orgfileName = new String(orgfileName.getBytes("UTF-8"), "ISO-8859-1");

response.setHeader("Content-Disposition", "attachment; filename= " + orgfileName);

ServletOutputStream out2 = response.getOutputStream();
int numRead;

while ((numRead = in.read(b, 0, b.length)) != -1) {
	out2.write(b, 0, numRead);
}

out2.flush();
out2.close();
in.close();

<%@ 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>
</head>
<body>

	<form action="fileformok.jsp" method="post" enctype="multipart/form-data">
		<div>파일: <input type="file" name="file"></div>
		<div><input type="submit" value="업로드"></div>
	</form>

</body>
</html>

 

<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String path = request.getRealPath("fileFolder");
	int size = 1024 * 1024 * 100; //100M
	String filename ="";
	String orgfilename = "";
	
	try {
	    MultipartRequest multi = new MultipartRequest(request, path, size, "UTF-8", new DefaultFileRenamePolicy());
	    
	    Enumeration e = multi.getFileNames();
	    String file = e.nextElement().toString();
	    
	    orgfilename = multi.getOriginalFileName(file);
      	filename = multi.getFilesystemName(file);
	    
	} catch(Exception e) {
	    e.printStackTrace();
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>	
	<h2>File upload success!</h2>
</body>
</html>

 

package com.test.file;

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;

@WebServlet("/multifile.do")
public class MultiFile extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/multifile.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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://me2.do/5BvBFJ57">
<style>
	#files > div { margin-bottom: 5px; }
	
	.item { margin-bottom: 5px; }
</style>
</head>
<body>

	<!-- 다중 파일 업로드 -->
	
	<h1>다중 파일 업로드</h1>
	
	<form method="POST" action="/file/multifileok.do" enctype="multipart/form-data">
		<div>
			<div>이름: </div>
			<div><input type="text" name="name"></div>
		</div>
		<div id="files">
			<div>파일: </div>
			<div class="item"><input type="file" name="attach1"></div>
			<div id="list"></div>
			<div><input type="button" value="+" id="btnadd"></div>
		</div>
		<div>
			<input type="submit" value="업로드">
		</div>
	</form>
	

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

	let n = 2;

	$('#btnadd').click(() => {
	    $('#list').append(
	            `<div class="item">
	            	<input type="file" name="attach\${n}">
	            	<input type="button" value="X" 
	            			onclick="$(this).parent().remove()">
	            </div>`);
	    n++;
	});

</script>
</body>
</html>

 

package com.test.file;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
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 com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@WebServlet("/multifileok.do")
public class MultiFileOk extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        
        List<String> olist = new ArrayList<String>();
        List<String> flist = new ArrayList<String>();

        try {

            MultipartRequest multi = new MultipartRequest(
                                        req,
                                        req.getRealPath("/files"),
                                        1024 * 1024 * 100,
                                        "UTF-8",
                                        new DefaultFileRenamePolicy()
                                     );
            
            Enumeration e = multi.getFileNames();
            
            while(e.hasMoreElements()) {
                
                String file = e.nextElement().toString();
                
                String orgfilename = multi.getOriginalFileName(file);
                String filename = multi.getFilesystemName(file);
                olist.add(orgfilename);
                flist.add(filename);
                
                req.setAttribute("olist", olist);
                req.setAttribute("flist", flist);
                
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/multifileok.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>
	
	<h1>결과</h1>
	
	<c:forEach var="i" begin="0" end="${flist.size()-1}">
		<div>다운로드: <a href="/file/download.do?filename=${flist[i]}&orgfilename=${olist[i]}">${olist[i]}</a></div>		
	</c:forEach>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

</script>
</body>
</html>

 

package com.test.file;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

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

@WebServlet("/download.do")
public class Download extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//제어 가능
		//1. 다운로드 횟수 저장 > update table set download = download + 1..
		//2. 권한 통제 > 현재 세션(사용자) + 다운로드 권한 체크
		

		String fileName = request.getParameter("filename");
		String orgfileName = request.getParameter("orgfilename");

		String savePath = "files";

		ServletContext context = getServletContext();
		String sDownloadPath = context.getRealPath(savePath);


		String sFilePath = sDownloadPath + "/" + fileName;
		byte b[] = new byte[4096];
		FileInputStream in = new FileInputStream(sFilePath);
		String sMimeType = getServletContext().getMimeType(sFilePath);
		System.out.println("sMimeType>>>" + sMimeType);

		if (sMimeType == null)
		{
			sMimeType = "application/octet-stream";
			//text/html
			//image/gif
			//application/zip
		}

		response.setContentType(sMimeType);
		String agent = request.getHeader("User-Agent");
		boolean ieBrowser = (agent.indexOf("MSIE") > -1) || (agent.indexOf("Trident") > -1);

		if (ieBrowser) {
			fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("/+", "%20");
		} else {
			fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
		}

		orgfileName = new String(orgfileName.getBytes("UTF-8"), "ISO-8859-1");

		response.setHeader("Content-Disposition", "attachment; filename= " + orgfileName);

		ServletOutputStream out2 = response.getOutputStream();
		int numRead;

		while ((numRead = in.read(b, 0, b.length)) != -1) {
			out2.write(b, 0, numRead);
		}
		out2.flush();
		out2.close();
		in.close();


	}

}

package com.test.file;

public class FileDTO {
    
    private String seq;
    private String name;
    private String filename;
    private String regdate;
    
    public String getSeq() {
        return seq;
    }
    
    public void setSeq(String seq) {
        this.seq = seq;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getFilename() {
        return filename;
    }
    
    public void setFilename(String filename) {
        this.filename = filename;
    }
    
    public String getRegdate() {
        return regdate;
    }
    
    public void setRegdate(String regdate) {
        this.regdate = regdate;
    }
    
}

 

package com.test.file;

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

import com.test.my.DBUtil;

//DAO, Data Access Object
// - DB 작업 담당자
// - 데이터 작업 담당자
public class FileDAO {
    
    private Connection con;
    private Statement st;
    private PreparedStatement pstat;
    private ResultSet rs;
    
    public FileDAO() {
        this.con = DBUtil.open();
    }

    public int add(FileDTO dto) {
        
        try {
            
            String sql = "insert into tblFile (seq, name, filename, regdate) values (seqFile.nextVal, ?, ?, default)";
            
            pstat = con.prepareStatement(sql);
            
            pstat.setString(1, dto.getName());
            pstat.setString(2, dto.getFilename());
            
            return pstat.executeUpdate();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return 0;
    }

    public List<FileDTO> list() {
        
        try {
            
            String sql = "select seq, filename from tblFile order by seq desc";
            
            st = con.createStatement();
            rs = st.executeQuery(sql);
            
            List<FileDTO> list = new ArrayList<FileDTO>();
            
            while(rs.next()) {
                
                //레코드 1줄 > FileDTO 1개
                FileDTO dto = new FileDTO();
                
                dto.setSeq(rs.getString("seq"));
                dto.setFilename(rs.getString("filename"));
                
                list.add(dto);
                
            }
            
            return list;
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }

    public FileDTO get(String seq) {
        
        
        try {
            
            String sql = "select * from tblFile where seq = ?";
            
            pstat = con.prepareStatement(sql);
            pstat.setString(1, seq);
            
            rs = pstat.executeQuery();
            
            
            if(rs.next()) {

                FileDTO dto = new FileDTO();
                
                dto.setSeq(rs.getString("seq"));
                dto.setName(rs.getString("name"));
                dto.setFilename(rs.getString("filename"));
                dto.setRegdate(rs.getString("regdate"));

                return dto;
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }

    public int edit(FileDTO dto) {
        
        try {
            
            String sql;
            
            if(dto.getFilename() != null && !dto.getFilename().equals("")) {
                sql = "update tblFile set name = ?, filename = ? where seq = ?";
                pstat = con.prepareStatement(sql);
                
                pstat.setString(1, dto.getName());
                pstat.setString(2, dto.getFilename());
                pstat.setString(3, dto.getSeq());
                
            } else {
                sql = "update tblFile set name = ? where seq = ?";
                pstat = con.prepareStatement(sql);
                
                pstat.setString(1, dto.getName());
                pstat.setString(2, dto.getSeq());
                
            }
            
            return pstat.executeUpdate();
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return 0;
    }
    
    public int remove(String seq) {
        
        try {
            
            String sql = "delete from tblFile where seq = ?";
            
            pstat = con.prepareStatement(sql);
            
            pstat.setString(1, seq);
            
            return pstat.executeUpdate();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return 0;
        
    }
    
}

 

package com.test.file;

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;

@WebServlet("/add.do")
public class Add extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/add.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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>Image Viewer</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

	<h1>Image Viewer</h1>
	
	<form method="POST" action="/file/addok.do" enctype="multipart/form-data">
	<table>
		<tr>
			<th>작성자</th>
			<td><input type="text" name="name" class="short" required autocomplete="off" autofocus></td>
		</tr>
		<tr>
			<th>이미지</th>
			<!-- <td><input type="file" name="attach" required accept=".gif, .png, .jpg, .jpeg"></td> -->
			<!-- <td><input type="file" name="attach" required accept="image/gif, image/jpeg, image/png"></td> -->
			<td><input type="file" name="attach" required accept="image/*"></td>
		</tr>		
	</table>
	
	<div>
		<input type="button" value="돌아가기" onclick="history.back();">
		<input type="submit" value="등록하기">
	</div>	
	</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

</script>
</body>
</html>

 

package com.test.file;

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;

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

@WebServlet("/addok.do")
public class AddOk extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 파일 업로드 처리
        //2. DB 처리
        
        String name = "";
        String filename = "";
        
        //1. 파일 업로드 처리
        try {
            
            MultipartRequest multi = new MultipartRequest(
                                        req,
                                        req.getRealPath("/files"),
                                        1024 * 1024 * 100,
                                        "UTF-8",
                                        new DefaultFileRenamePolicy()
                                    );
            //System.out.println(req.getRealPath("/files"));
            
            filename = multi.getFilesystemName("attach");
            name = multi.getParameter("name");
                    
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        
        //2. DB처리
        
        FileDAO dao = new FileDAO();
        FileDTO dto = new FileDTO();
        
        dto.setName(name);
        dto.setFilename(filename);
        
        int result = dao.add(dto); //성공(1), 실패(0)
        
        req.setAttribute("result", result);
        

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/addok.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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>Image Viewer</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

	<c:if test="${result == 1}">
	location.href = '/file/list.do';
	</c:if>
	
	<c:if test="${result == 0}">
	alert('failed');
	history.back();
	</c:if>
	
</script>
</body>
</html>

 

package com.test.file;

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;

@WebServlet("/list.do")
public class List extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. DB 작업 > DAO 위임 > select
        //2. 결과 반환(List<FileDTO>)
        //3. JSP 호출하기
        
        FileDAO dao = new FileDAO();
        java.util.List<FileDTO> list = dao.list();
        
        req.setAttribute("list", list);
        
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/list.jsp");
        dispatcher.forward(req, resp);
        
    }

}

 

<%@ 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>Image Viewer</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

	img {
		display: block;
		width: 140px;
		height: 140px;
		margin: 0 auto;
		object-fit: cover;
		cursor: pointer;
	}

</style>
</head>
<body>
	<h1>Image Viewer</h1>
	
	<table>
		<tr>		
			<c:forEach items="${list}" var="dto" varStatus="status">
			<td>
				<img src="/file/files/${dto.filename}" onclick="view(${dto.seq});">
			</td>
			
			<c:if test="${status.count % 5 == 0}">
				</tr>
				<tr>
			</c:if>
			
			</c:forEach>
			
			<c:forEach var="i" begin="1" end="${5 - list.size() % 5}">
				<td></td>
			</c:forEach>
		</tr>
	</table>
	
	<div>
		<input type="button" value="등록하기" onclick="location.href='/file/add.do'">
	</div>
	
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

	function view(seq) {
	    
		location.href = '/file/view.do?seq=' + seq;
		
	}
	
</script>
</body>
</html>

 

package com.test.file;

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;

@WebServlet("/view.do")
public class View extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 번호 가져오기
        //2. DB 작업 > DAO 위임 > select where seq = ?
        //3. 결과 반환 > JSP 호출하기
        
        String seq = req.getParameter("seq");
        
        FileDAO dao = new FileDAO();

        FileDTO dto = dao.get(seq);
        
        req.setAttribute("dto", dto);
        
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/view.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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>Image Viewer</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

	img {
		display: block;
		margin: 20px auto;
		max-width: 700px;
	}
	
</style>
</head>
<body>

	<h1>Image Viewer</h1>
	
	<table>
		<tr>
			<td colspan="2"><img src="/file/files/${dto.filename}"></td>
		</tr>
		<tr>
			<td>${dto.name}</td>
			<td>${dto.regdate}</td>
		</tr>
	</table>

	<div>
		<input type="button" value="돌아가기" onclick="location.href='/file/list.do';">
		<input type="button" value="수정하기" onclick="location.href='/file/edit.do?seq=${dto.seq}';">
		<input type="button" value="삭제하기" onclick="location.href='/file/delok.do?seq=${dto.seq}';">
	</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

</script>
</body>
</html>

 

package com.test.file;

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;

@WebServlet("/edit.do")
public class Edit extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 번호 가져오기
        //2. DB 작업 > DAO 위임 > select
        //3. 결과 반환 > JSP 호출하기

        String seq = req.getParameter("seq");
        
        FileDAO dao = new FileDAO();
        
        FileDTO dto = dao.get(seq);
        
        req.setAttribute("dto", dto);
        
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/edit.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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>Image Viewer</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

	<h1>Image Viewer</h1>
	<form method="POST" action="/file/editok.do" enctype="multipart/form-data">
	<table>
		<tr>
			<th>작성자</th>
			<td><input type="text" name="name" class="short" required autocomplete="off" autofocus value="${dto.name}"></td>
		</tr>
		<tr>
			<th>이미지</th>
			<td>
				<input type="file" name="attach">
				<span>${dto.filename}</span>
			</td>
		</tr>		
	</table>
	
	<div>
		<input type="button" value="돌아가기" onclick="history.back();">
		<input type="submit" value="수정하기">
	</div>	

	<input type="hidden" name="seq" value="${dto.seq}">
	</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
	
	$('input[name=attach]').change(function() {
	   
	    if ($(this).val() != '') {
	   		$(this).next().css('text-decoration', 'line-through');
	    } else {
	        $(this).next().css('text-decoration', 'none');
	    }
	    
	});
	
	
</script>
</body>
</html>

 

package com.test.file;

import java.io.File;
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;

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

@WebServlet("/editok.do")
public class EditOk extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 데이터 가져오기
        //2. DB 작업 > DAO 위임 > update

        String name = "";
        String filename = "";
        String seq = "";

        try {

            MultipartRequest multi = new MultipartRequest(
                                        req,
                                        req.getRealPath("/files"),
                                        1024 * 1024 * 100,
                                        "UTF-8",
                                        new DefaultFileRenamePolicy()
                                    );
            
            System.out.println("attach: " + multi.getFilesystemName("attach"));
            
            name = multi.getParameter("name");
            filename = multi.getFilesystemName("attach");
            seq = multi.getParameter("seq");
            

        } catch (Exception e) {
            e.printStackTrace();
        }

        
        FileDAO dao = new FileDAO();

        
        if (filename != "") {
            
            //기존 파일 삭제 > 새 파일 교체
            File file = new File(req.getRealPath("/files") + "\\" + dao.get(seq).getFilename());
            file.delete();
            
        }
        
        FileDTO dto = new FileDTO();
        
        dto.setName(name);
        dto.setFilename(filename);
        dto.setSeq(seq);
        
        int result = dao.edit(dto);
        
        req.setAttribute("result", result);
        req.setAttribute("seq", seq);
        
        
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/editok.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>	

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
	<c:if test="${result == 1}">
	location.href = '/file/view.do?seq=${seq}';
	</c:if>
	
	<c:if test="${result == 0}">
	alert('failed');
	history.back();
	</c:if>
</script>
</body>
</html>

 

package com.test.file;

import java.io.File;
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;

@WebServlet("/delok.do")
public class DelOk extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 데이터 가져오기(seq)
        //2. 파일 삭제
        //3. DB작업 > DAO 위임 > delete
        
        String seq = req.getParameter("seq");
        
        FileDAO dao = new FileDAO();
        
        //사진 삭제할 떄는 DB 작업 전에 먼저 지우기!
        FileDTO dto = dao.get(seq);
        
        try {
            
            File file = new File(req.getRealPath("/files") + "\\" + dto.getFilename());
            file.delete();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        int result = dao.remove(seq);
        
        
        req.setAttribute("result", result);

        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/delok.jsp");
        dispatcher.forward(req, resp);

    }

}

 

<%@ 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>Image Viewer</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

	<c:if test="${result == 1}">
	location.href = '/file/list.do';
	</c:if>
	
	<c:if test="${result == 0}">
	alert('failed');
	history.back();
	</c:if>
	
</script>
</body>
</html>