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);
위 두 줄의 코드는 파일을 다운로드 할 수 있도록 설정해주는 것.
버퍼 기능으로 파일에서 버퍼로 8kbyte씩 나누어 읽어와
한번에 출력하는 것.
out.write(buffer, 0, count); : 다운로드쪽으로 내려가게하는 것
처음 실행 창 (first.jsp)
이미지 다운로드를 클릭하면
result.jsp
파일 내려받기를 클릭하면
파일이 다운로드 된다.
나는 크롬 브라우저를 이용하기 때문에,
크롬브라우저에서 설정해놓은 다운로드 폴더(나의 경우 바탕화면)에
해당 파일이 다운로드된 것을 확인할 수 있다.
(출처 : 짧고 굵게 배우는 JSP 웹 프로그래밍과 스프링 프레임워크(황희정))
'JSP 웹프로그래밍' 카테고리의 다른 글
JSP #8 : 커스텀 태그 & EL & JSTL (230105)2 (0) | 2023.01.05 |
---|---|
JSP #7 : 액션 태그 (230105)2 (0) | 2023.01.05 |
JSP #5 : JSP 지시어, 템플릿 데이터, 스크립트 요소 (230104)2 (0) | 2023.01.04 |
JSP : 계산기 (html, jsp파일) (0) | 2023.01.04 |
JSP #4 : 속성관리 (230104)1 (0) | 2023.01.04 |
댓글