1. 파일 업로드 & 다운로드
1. 파일 업로드 & 다운로드
- 파일업로드: 클라이언트측 자원 -> 서버측 전송(= 파일 복사)
- 다운로드: 서버측 자원 -> 클라이언트측 전송(= 파일 복사)
- JDK(JRE)에는 파일 업로드 기능이 따로 존재하지 않는다. ( 파일 업로드 라이브러리를 통해 해야함 )
- 수업에서 사용하는 파일 업로드 라이브러리는 COS lib 이다.
Servlets.com
Home What's New? COS File Upload Library Servlet Polls Mailing Lists Servlet Engines Servlet ISPs Servlet Tools Documentation Online Articles The Soapbox "Java Servlet Programming, Second Edition" "Java Enterprise Best Practices" Speaking & Slides About Ja
www.servlets.com
[ 3가지 규칙 ]
1) <form>의 method를 반드시 "POST"를 사용한다.
2) <input type="file">을 사용한다.
3) <form>태그에 반드시 enctype="multipart/form-data" 속성을 추가한다.
- enctype: 인코딩 타입이며, 폼태그가 서버로 데이터를 전송할 때 사용할 인코딩 방식을 지정한다.
a) application/x-www-form-urlencoded: 문자열만 전송한다.(default)
b) multipart/form-data: 비문자열까지 같이 전송한다.(첨부 파일 전송)
[ 파일 업로드 처리 ]
- 업로드된 파일을 어디에 저장할 지 결정한다. (반드시 로컬 경로로 표시(드라이브명으로 시작))
- 업로드된 파일의 최대 크기 지정 (최대한 작게, byte 단위)
- 변수 선언 (입력데이터, 첨부 파일명 등..)
- <form enctype="multipart/form-data"> 으로 선언 되면 기존의 request 객체의 getParamerter()가 정상 작동하지 않는다. ( 인코딩 변경 때문에 안됨 )
--> request 객체를 대신할 다른 객체로 사용한다. -> cos.jar -> MultipartRequest 사용
- 서버가 보낸 한글 데이터를 안깨지도록 인코딩 한다. (setCharacterEncoding("UTF-8"))
[ 파일 업로드 & 다운로드 예제 ]
- 파일 업로드할 페이지 1개, 다운로드 받을 (결과) 페이지 1개
- 파일 업로드(exam_file.jsp)
<form method="POST" action="exam_download.jsp" enctype="multipart/form-data">
<div>파일: <input type="file" name="attach" /></div>
<div><input type="submit" value="보내기" /></div>
</form>
- 다운로드 페이지(exam_download.jsp)
<%
// 파일 업로드 처리
// 1. 업로드된 파일을 어디에 저장할 지 결정한다.
// "/files" : 가상 경로를 물리 경로로 바꿔준다.
String path = application.getRealPath("/files");
// D:\class\server\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\JSPTest\files
// ----------------------------------------------------------------------
// 2. 업로드 파일의 최대 크기 지정
int size = 1024 * 1024 * 100; // 100MB
// ----------------------------------------------------------------------
// 3. 변수 선언
String subject = ""; // 입력 데이터
String name = "";
String filename = ""; // 첨부 파일명
String orgfilename = ""; // 첨부 파일명
// ----------------------------------------------------------------------
// 서버가 보낸 한글 데이터를 안깨지도록 인코딩
request.setCharacterEncoding("UTF-8");
// 파일 업로드 처리 -> 외부 입출력 -> try 필수
try {
// request -> MultipartRequest
// com.oreilly.servlet.MultipartRequest --> import
// 이 객체를 생성하는 순간 업로드 된 파일은 처리를 마치고 첨부파일 폴더에 저장되어 있다.
MultipartRequest multi = new MultipartRequest(
request, // 기존의 request Wrapping 클래스
path, // 업로드 폴더 지정
size, // 업로드 크기 지정
"UTF-8", // 인코딩 지정
new DefaultFileRenamePolicy() // 중복된 파일명을 처리 -> 넘버링 카운트
);
// 데이터 수신하기
subject = multi.getParameter("subject");
name = multi.getParameter("name");
// 파일 정보 수신하기(***)
// - 첨부 파일 가져오기
// - <input type="file" name="attach" />
// - 파일 name을 입력한다.
// - multi.getFilesystemName("attach");
// 실제로 저장된 파일명 (넘버링 O)
filename = multi.getFilesystemName("attach");
// 사용자가 올린 파일명 (넘버링 X)
orgfilename = multi.getOriginalFileName("attach");
} catch (Exception e) {
System.out.println(e);
}
%>
<h2>다운로드</h2>
<div>제목: <%= subject %></div>
<div>이름: <%= name %></div>
<div>첨부파일명(실제): <%= filename %></div>
<div>첨부파일명(원본): <%= orgfilename %></div>
<!-- 방법1. (txt, page, img는 알아서 해석해서 보여줌) -->
<div><a href="/jsp/files/<%= filename %>"><%= orgfilename %></a></div>
<!-- 방법2. (무조건 다운로드 하게 해줌) -->
<div><a href="/jsp/download.jsp?filename=<%= filename %>&orgfilename=<%= orgfilename %>"><%= orgfilename %></a></div>
- 결과
[ 결과 해석 ]
- filename: 첨부파일명(실제)는 업로드된 파일경로에 넘버링을 지정해줬기 때문에(new DefaultFileRenamePolicy()) 업로드 시 중복된 파일명이 있을 경우 testImage1.png, testImage2.png, testImage3.png ..이렇게 카운트가 되는 실제 첨부파일명을 뜻한다.
- orgfilename: 첨부파일명(원본)은 넘버링과 상관없이, 말 그대로 원본 파일명 testImage.png를 나타낸다.
- 첫번째 다운로드 링크는 이미지 파일 이므로, 웹 페이지에서 자동 해석하여 바로 보여준다.
- 두번째 다운로드 링크는 파일의 종류와 상관없이 무조건 다운로드 받을 수 있게 해준다.
-> 브라우저는 링크 대상이 자신이 열 수 있는 파일(텍스트, 웹페이지, 이미지) 이면 해석해서 보여주고, 알 수없는 파일(zip..)이면 다운로드를 한다.
MEMO>
# JSTL은 XML 문법을 준수한다. ( 문법이 엄격하다 )
# empty는 데이터 유무를 확인할 때(true, false) 종종 쓰인다.
# 액션태그(EL, JSTL)은 어느정도 이해가 가는데, 오늘 배운 파일 업로드 부분은 경로랑, 처음보는 메소드를 써서 그런지 잘 이해가 되지 않는다. 복습 ㄱㄱ
# 교육과정에 가장 중요한 프로젝트 중 하나인 웹 프로젝트를 오늘부터 약 4주간 시작한다. 어려워도 꼼꼼히 하나씩 천천히 해보자
'인천일보아카데미 > - 학습일지' 카테고리의 다른 글
[학습일지]JAVA교육일지 70일차 (SERVER)⭐ (0) | 2022.07.12 |
---|---|
[학습일지]JAVA교육일지 69일차 (SERVER)⭐ (0) | 2022.07.08 |
[학습일지]JAVA교육일지 66일차 (SERVER)⭐ (0) | 2022.07.07 |
[학습일지]JAVA교육일지 65일차 (SERVER)⭐ (0) | 2022.07.07 |
[학습일지]JAVA교육일지 64일차 (SERVER)⭐ (0) | 2022.07.05 |