1. JSP에서 파일 업로드
1) 파일 업로드 라이브러리 설치
1. jakarta.apache.org로 접속 후 왼쪽 메뉴의 Commons 클릭
2. 왼쪽 중간 쯤 위치한 FileUpload 클릭
3. FileUpload 1.3.3의 here 링크를 클릭
4. binaries/ 를 클릭, commons-fileupload-1.3.3-bin.zip 클릭해서 파일을 다운로드
5. 압축을 풀고 commons-fileupload-1.3.3-bin에 위치한 commons-fileupload-1.3.3.jar 파일을 프로젝트 라이브러리 경로에 추가한다.
2) commons-io-2.6.jar 파일 설치
1. http://commons.apache.org/proper/commons-io/download_io.cgi 로 접속해서 archives 클릭
2. binaries/ 를 클릭, commons-io-2.6-bin.zip 클릭해서 다운로드
3. 압축을 풀고 commons-io-2.6-bin에 위치한 commons-io-2.6.jar 파일을 프로젝트 라이브러리 경로에 추가한다.
3) 파일 업로드 관련 API
DiskFileItemFactory 클래스가 제공하는 메서드
메서드 | 기능 |
setRepository( ) | 파일을 저장할 디렉터리를 설정 |
setSizeThreadhold( ) | 최대 업로드 가능한 파일 크기를 설정 |
ServletFileUpload 클래스가 제공하는 메서드
메서드 | 기능 |
parseRequest( ) | 전송된 매개변수를 List 객체로 얻음 |
getItemIterator( ) | 전송된 매개변수를 Iterator 타입으로 얻음 |
4) JSP 페이지에서 파일 업로드
uploadForm.jsp
<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>
파일을 업로드할 때 <form>태그의 encType 속성은 반드시 multipart/form-data로 지정
FileUpload.java
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);
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);
} // end if
} // end if
} // end for
} catch (Exception e) {
e.printStackTrace();
}
}
DiskFileItemFactory클래스를 이용해 저장 위치와 업로드 가능한 최대 파일 크기를 설정한다. 그리고 ServletFileUpload를 이용해 파일 업로드창에서 업로드된 파일과 매개변수에 대한 정보를 가져와 파일을 업로드하고 매개변수 값을 출력한다
file_repo 폴더를 생성하고 uploadForm.jsp를 실행해보자
파일저장소에 가면 업로드된 파일을 확인할 수 있다.
또한 Console탭을 확인하면 매개변수 정보와 파일정보가 출력된 것을 확인할 수 있다.
2. JSP에서 파일 다운로드
first.jsp
<form method="post" action="result.jsp">
<%-- 다운로드할 파일 이름을 매개변수로 전달함 --%>
<input type=hidden name="param1" value="aws.png" /> <br>
<input type=hidden name="param2" value="http.jpg" /> <br>
<input type="submit" value="이미지 다운로드">
</form>
result.jsp
<%-- 다운로드할 파일 이름을 가져옴 --%>
<c:set var="file1" value="${param.param1}" />
<c:set var="file2" value="${param.param2}" />
<body>
매개변수 1 :
<c:out value="${file1}" /><br>
매개변수 2 :
<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>
FileDownload.java
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();
}
response.getOutputStream();을 호출해 OutputStream을 가져온다. 그리고 배열로 버퍼를 만든 후 while 반복문을 이용해 파일에서 데이터를 한번에 8kb씩 버퍼에 읽어온다. 이어서 OutputStream의 write()메서드를 이용해 다시 브라우저로 출력한다
참고 : ⌜자바 웹을 다루는 기술⌟ 책을 공부하며 요약・정리한 내용입니다.
'💻 Web_Back end > JSP' 카테고리의 다른 글
[JSP] 마이바티스 프레임워크 사용하기 (0) | 2023.05.18 |
---|---|
[JSTL] 포매팅 태그 라이브러리와 문자열 처리 함수 사용하기 (1) | 2023.05.05 |
[JSTL] 다국어 태그 라이브러리 사용하기 (1) | 2023.05.05 |
[JSTL] JSP 표준 태그 라이브러리 (0) | 2023.05.03 |
표현언어 내장객체 (requesetScope, pageContext, Collection, HashMap, has-a) (0) | 2023.05.02 |