본문 바로가기
JSP 웹프로그래밍

JSP #6 : JSP 파일 업로드 (230104)2

by haheehee 2023. 1. 5.

src-main-webapp-WEB-INF-lib에 commons-fileupload-1.3.3.jar와 commons-io-2.6.jar 넣기

파일을 업로드할 때 사용할 저장소를 C드라이브에 "file_repo"로 만든다.

 

- 파일 업로드 API

     DiskFileItemFactory 클래스

          setRepository() : 파일을 저장할 디렉토리 설정

          setSizeThreadhold() : 최대 업로드 가능한 파일 크기 설정

     ServletFileUpload 클래스

          parseRequest() : 전송된 매개 변수를 List객체로 얻기

          getItemIterator() : 전송된 매개변수를 Iterator타입으로 얻기


JSP 페이지에서 파일 업로드 실습

선택되어 있는 두가지 .jar 파일은 파일 업로드에, 나머지 파일은 jstl에 사용되는 파일들.

이 파일들을

해당 dynamic web folder-src-main-webapp-WEB-INF에 lib폴더를 생성하여 Copy해야된다.

그 후, 실습 진행

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:set var="contextPath" value="${pageContext.request.contextPath}"></c:set>
<%
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>파일 업로드 창</title>
</head>
<body>
	<form action="${contextPath}/upload.do" method="post" enctype="multipart/form-data">
		파일1 : <input type="file" name="file1"> <br>
		파일2 : <input type="file" name="file2"> <br>
		매개변수1 : <input type="text" name="param1"> <br>
		매개변수2 : <input type="text" name="param2"> <br>
		매개변수3 : <input type="text" name="param3"> <br>
		<input type="submit" value="업로드">
	</form>
</body>
</html>

html (JSP) 파일

- 파일 업로드 시 encType을 multipart/form-data로 설정해야 한다.

- taglib 지시어**

- 경로를 contextPath를 사용하여 action을 지정해주기.

@WebServlet("/upload.do")
public class FileUpload extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String encoding="utf-8";
		File currentDirPath = new File("C:\\file_repo");
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(currentDirPath);
		factory.setSizeThreshold(1024*1024);	// 1M byte가 최대 업로드 용량
		
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			List items = upload.parseRequest(request);
			for(int i=0; i<items.size(); i++) {
				FileItem fileItem = (FileItem) items.get(i);
				
				if(fileItem.isFormField()) {
					System.out.println(fileItem.getFieldName() + "=" + fileItem.getString(encoding));
				} else {
					System.out.println("매개변수 이름 : " + fileItem.getFieldName());
					System.out.println("파일이름 : " + fileItem.getName());
					System.out.println("파일크기 : " + fileItem.getSize() + "bytes");
					
					if(fileItem.getSize() > 0) {
						int idx = fileItem.getName().lastIndexOf("\\");
						if(idx == -1) {
							idx = fileItem.getName().lastIndexOf("/");
						}
						String fileName = fileItem.getName().substring(idx+1);
						File uploadFile = new File(currentDirPath + "\\" + fileName);
						
						fileItem.write(uploadFile);
					}
				}
			}
		} catch(Exception e) { e.printStackTrace(); }
	}
}

서블릿 파일

- File currentDirPath = new File("C:\\file_repo");       : 업로드할 파일 경로 지정

- factory.setRepository(currentDirPath);       : 파일 경로 설정

- factory.setSizeThreshold(1024 * 1024);          : 최대 업로드 가능 파일 크기 설정

 

이미지 파일 2개와 매개변수에 값을 입력

URL창에서 upload.do가 실행된 것을 확인할 수 있고, 

Console창에서도 확인할 수 있다.

업로드한 매개변수 이름과 정보, 파일 이름을 확인할 수 있다. 

설정한 디렉토리(file_repo)에 업로드한 파일이 저장된 것을 확인할 수 있다.

 

- file_repo 폴더 안에 동일명의 파일이 있으면, 저장이 되지 않도록 if문을 추가하는 것을 추천

- 경로설정할 때, "./" 는 현재 위치라는 뜻!!!

- context가 프로젝트라는 뜻!!!


JSP 페이지에서 파일 다운로드 실습

first -> result -> download.do

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>이미지 다운로드 창</title>
</head>
<body>
	<form method="post" action="result.jsp">
		<input type=hidden name="param1" value="slider_1.jpg" /> <br>
		<input type=hidden name="param2" value="slider_2.jpg" /> <br>
		<input type="submit" value="이미지 다운로드">
	</form>
</body>
</html>

first.jsp

여기서 result.jsp로 넘어간다.

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"></c:set>
<%
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<c:set var="file1" value="${param.param1}" />
<c:set var="file2" value="${param.param2}" />
<title>이미지 파일 출력하기</title>
</head>
<body>
	parameter1 : <c:out value="${file1}" /> <br>
	parameter2 : <c:out value="${file2}" /> <br>
	<c:if test="${not empty file1}">
		<img src="${contextPath}/download.do?fileName=${file1}" width=300 height=300 /> <br>
	</c:if> <br>
	<c:if test="${not empty file2}">
		<img src="${contextPath}/download.do?fileName=${file2}" width=300 height=300 /> <br>
	</c:if>
	파일 내려받기 : <br>
	<a href="${contextPath}/download.do?fileName=${file2}">파일 내려받기</a><br>
</body>
</html>

result.jsp

여기서 download.do(서블릿 파일) 호출

 

jsp파일 가장 상단에 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" isELIgnored="false"%>

 

param은 getParameter()의 준말

-> value="${param.param1}"  이런식으로 사용 가능

<c:set var="file2" value="${param.param2}" />      : 다운로드할 파일 이름 가지고 오는 것

 

<c:if test="${not empty file1}">    : 커스텀태그 안에 if문으로. file1이 비어있지 않아야한다.

<img src="${contextPath}/download.do?fileName=${file1}" width=300 height=300 />

: 파일 이름으로 서블릿에서 이미지를 다운로드해 표시

<a href="${contextPath}/download.do?fileName=${file2}">파일 내려받기</a> : 이미지 다운로드

@WebServlet("/download.do")
public class FileDownload extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		String file_repo="C:\\file_repo";
		String fileName = (String)request.getParameter("fileName");
		System.out.println("fileName=" + fileName);
		OutputStream out = response.getOutputStream();
		String downFile = file_repo + "\\" + fileName;
		File f = new File(downFile);
		response.setHeader("Cache-Control",  "no-cache");
		response.addHeader("Content-disposition",  "attachment; fileName=" + fileName);
		
		FileInputStream in = new FileInputStream(f);
		byte[] buffer = new byte[1024 * 8];
		while(true) {
			int count = in.read(buffer);
			if(count == -1) break;
			out.write(buffer, 0, count);
		}
		in.close();
		out.close();
	}
}

/download.do (서블릿 파일)

 

response.setHeader("Cache-Control",  "no-cache");
response.addHeader("Content-disposition",  "attachment; fileName=" + fileName);

위 두 줄의 코드는 파일을 다운로드 할 수 있도록 설정해주는 것.

 

.java(서블릿)파일

버퍼 기능으로 파일에서 버퍼로 8kbyte씩 나누어 읽어와

한번에 출력하는 것.

out.write(buffer, 0, count);         : 다운로드쪽으로 내려가게하는 것

 

처음 실행 창 (first.jsp)

이미지 다운로드를 클릭하면

result.jsp

파일 내려받기를 클릭하면

파일이 다운로드 된다.

나는 크롬 브라우저를 이용하기 때문에,

크롬브라우저에서 설정해놓은 다운로드 폴더(나의 경우 바탕화면)에 

해당 파일이 다운로드된 것을 확인할 수 있다.

 

 

 

 

 

 

 

(출처 : 짧고 굵게 배우는 JSP 웹 프로그래밍과 스프링 프레임워크(황희정))

 

 

댓글