파일 업로드
▶JSP 에서의 파일 업로드는 HTML FORM 을 이용하는 방법과, 혹은 이미 많이 공개된 파일 업로드 모듈들을 활용하는 방법이 있습니다.
▶HTTP 프로토콜에서 파일을 주고 받는 것에 대한 규약은 RFC1867(ftp://ftp.rfc-editor.org/in-notes/rfc1876.txt)에 "HTML의 form 기반 파일 업로드" 라는 제목으로 정해져 있습니다.
★HTML FORM 의 구성은 다음과 같습니다.
구분 | 일반 | 파일전송 |
METHOD | GET, POST | POST |
TYPE | CHECKBOX, HIDDEN, IMAGE, PASSWORD RADIO, RESET, SUBMIT, TEXT | FILE |
ENCType | application/x-www-form-urlencoded | multipart/form-data |
# 예제 1. - p202~204
▣ uploadform.html 의 예제 입니다.
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<% request.setCharacterEncoding("UTF-8"); %>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2> REQUEST 정보 </h2></center>
<hr/>
<pre>
contentType : <font color = "blue"><%=request.getContentType() %></font>
contentLength : <font color = "blue"><%=request.getContentLength() %></font>
method : <font color = "blue"><%=request.getMethod() %></font>
field1 : <font color = "blue"><%=request.getParameter("f1") %></font>
field2 : <font color = "blue"><%=request.getParameter("f2") %></font>
file1 : <font color = "blue"><%=request.getParameter("fi1") %></font>
file2 : <font color = "blue"><%=request.getParameter("fi2") %></font>
</pre>
<hr/>
<center><h2> Request 스트림</h2></center>
<hr/>
<xmp><%
//request를 스트림으로 받아서 BufferedReader에 넣는다.
BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line;
//BufferedReader에서 한줄씩 빼서 출력한다.
//스트림의 끝에 도달할 경우 null이 반환된다.
while((line = in.readLine()) != null){
out.println(line);
} //end while
%>
</xmp>
</body>
</html>
▣formproc.jsp 예제 입니다.
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<% request.setCharacterEncoding("UTF-8"); %>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h2> REQUEST 정보 </h2></center>
<hr/>
<pre>
contentType : <font color = "blue"><%=request.getContentType() %></font>
contentLength : <font color = "blue"><%=request.getContentLength() %></font>
method : <font color = "blue"><%=request.getMethod() %></font>
field1 : <font color = "blue"><%=request.getParameter("f1") %></font>
field2 : <font color = "blue"><%=request.getParameter("f2") %></font>
file1 : <font color = "blue"><%=request.getParameter("fi1") %></font>
file2 : <font color = "blue"><%=request.getParameter("fi2") %></font>
</pre>
<hr/>
<center><h2> Request 스트림</h2></center>
<hr/>
<xmp><%
//request를 스트림으로 받아서 BufferedReader에 넣는다.
BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line;
//BufferedReader에서 한줄씩 빼서 출력한다.
//스트림의 끝에 도달할 경우 null이 반환된다.
while((line = in.readLine()) != null){
out.println(line);
} //end while
%>
</xmp>
</body>
</html>
이거 말고 쉬운 건 없냐구? - > 옛다. COS.JAR
▶파일 업로드 컴포넌 중 현재 가장 인정 받고 있는 COS 패키지의 MultipartRequest를 사용하여 파일 업로드 기능을 구현할 수 있습니다.
▶COS(com.oreillt.servlet)라이브러리는 오라일리의 책 '자바 서블릿 프로그램'(2001,한빛미디어)에 소개된 라이브러리로서 책의 저자인 제이슨 헌터(Jason Hunter)가 제작하여 servlets.com 을 통하여 배포하는 라이브러리 입니다.
▣설치하기
- 먼저 http://www.servlets.com 으로 접속하여 왼쪽메뉴 "com.oreilly.servlet"을 클릭한 후 아래의 그림과 같이 다운 받습니다.
- 다운받은 파일은 압축을 풀고, 그 폴더 속을 살펴보면 lib 폴더가 있습니다. 이 폴더안에 COS.jar 파일이 있으며, 나중에 웹 프로젝트 및 WEB-INF/lib 에 넣어서 사용하면 됩니다.
▣실제 프로젝트에 적용해보기
--fileSelect.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>파일 업로드 예제</title>
</head>
<body>
<form name="fileForm" method="post" enctype="multipart/form-data" action="fileUpload.jsp">
<!-- enctype="multipart/form-data" 파일이나 대용량 데이터 보낼때 데이터 전송 방식 -->
작성자 : <input type="text" name="name"><br>
제목 : <input type="text" name="subject"><br>
파일명1 : <input type="file" name="filename1"><br>
파일명2 : <input type="file" name="filename2"><br>
<input type="submit" value="파일올리기"><br>
</form>
</body>
</html>
--fileUpload.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %> <!-- 파일 업로드 처리를 위한 MultipartRequest 객체를 임포트 -->
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %> <!-- 파일 중복처리 객체 임포트 -->
<%@ page import="java.util.*" %>
<%
String uploadPath = request.getRealPath("upload");
// 업로드 경로 지정, getRealPath()는 실제 디렉토리 경로를 얻어옴
int size = 10*1024*1024; // 업로드 파일 최대 크기 지정
String name=""
String subject=""
String filename1=""
String filename2=""
String realFolder=""
String saveFolder="/upload/"
ServletContext context = getServletContext();
realFolder = context.getRealPath(saveFolder); // 절대 경로 가져오기
out.println("업로드 폴더 : "+realFolder+"<br>"); // 업로드 폴더 출력
try{
MultipartRequest multi = new MultipartRequest(request, uploadPath, size, "euc-kr", new DefaultFileRenamePolicy());
// 파일 업로드 담당하는 부분, 폼에서 가져온 인자값을 얻기 위해request 객체 전달, 업로드 경로, 파일 최대 크기, 한글처리, 파일 중복처리
name = multi.getParameter("name");
subject = multi.getParameter("subject");
// 폼에서 입력한 값을 가져옴
Enumeration files = multi.getFileNames();
// 업로드한 파일들을 Enumeration 타입으로 반환
// Enumeration형은 데이터를 뽑아올때 유용한 인터페이스 Enumeration객체는 java.util 팩키지에 정의 되어있으므로
// java.util.Enumeration을 import 시켜야 한다.
String file1 =(String)files.nextElement();
filename1=multi.getFilesystemName(file1);
String file2 =(String)files.nextElement();
filename2=multi.getFilesystemName(file2);
// 업로드한 파일들의 이름을 얻어옴
}catch(Exception e){
e.printStackTrace();
}
// 예외처리
out.println("작성자 : "+name+"<br>");
out.println("제목 : "+subject+"<br>");
%>
<html>
<body>
파일명1 : <a href="upload/<%=filename1 %>"><%=filename1 %></a><br>
파일명2 : <a href="upload/<%=filename2 %>"><%=filename2 %></a><p>
<!-- 파일명을 링크 -->
</body>
</html>
--------------------------위의 소스로 프로젝트를 만들고 WAR 로 EXPORT한 후에,
톰캣이 설치된 폴더 (기본 : C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps)에 복사하고
이클립스가 아닌 설치된 톰캣을 실행하면 WAR 파일이 컨테이너에 포함되고, INTERNET EXPLORER를 통하여 접속할 수 있습니다.
★이클립스에서 하지 않는 이유는 파일 업로드 및 다운로드가 제대로 안됩니다. 가상으로 디렉토리를 설정하는 것 같아요..
'Languages > JSP' 카테고리의 다른 글
JSP - 스크립트 요소 (0) | 2012.10.26 |
---|---|
JSP - 데이터를 담는다! BEAN! (0) | 2012.10.26 |
JSP - 컴포넌트 - SmartEditor JSP에 적용하기 (5) | 2012.10.26 |
JSP - 세션관리 (0) | 2012.10.26 |
JSP - 내장객체 (0) | 2012.10.26 |