본문 바로가기

Languages/JSP

JSP - 파일 업로드



파일 업로드


▶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 : <href="upload/<%=filename1 %>"><%=filename1 %></a><br>

파일명2 : <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