본문 바로가기

웹 개발/설정 및 오류해결

[JSP] cos.jar 를 이용하여 eclipse 에서 파일 업로드 기능 구현하기

웹페이지에서 파일 업로드 기능을 구현하는 방법은 여러가지가 있는데, 그중에서 cos.jar를 이용하는 방법이 꽤 간편한 방법인 듯 하다.  

 

cos.jar 파일 다운로드

www.servlets.com 접속하기(☜ 새창에서 열기)

( 혹은 첨부된 파일 다운로드 )

cos.jar
0.05MB

 

 

COS File Upload Library 접속

 

 

com.oreilly.servlet 접속

 

하단에 위치한 zip파일 다운로드

 


cos.jar 파일 - library로 세팅하기

먼저 cos.jar 파일이 라이브러리로서 접근할 수 있는 위치에 있어야 한다.

[웹프로젝트] > WebContent > WEB-INF > lib 에 cos.jar파일을 준비한다. 파일을 드래그 해도 되고, 복사+붙여넣기 해도 된다.

 

 

form 코딩

html 혹은 jsp 를 이용하여 form 양식이 있는 페이지를 만들자.

  • form으로 업로드할 input 타입 속성을 file 로 지정
  • form enctype 속성을 multipart/form-data 로 지정
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
	<h1>form</h1>
	<form action="form_result.jsp" method="post" enctype="multipart/form-data">
		<input type="file" name="file">
		<input type="submit" value="전송">	
	</form>	
</body>
</html>

 

 

form을 처리할 로직 코딩

new 연산자로 MultipartRequest 객체를 새로 생성한다. MultipartRequest 객체의 생성방법은 여러개가 있는데 보통 인자값을 5개 지정하여 생성한다.

인자값 예시
HttpServletRequest 변수 request
업로드된 파일이 저장될 디렉토리 위치 (String) "D:/JSP_workspace/JSP_fileUpload/WebContent/uploaded"
파일크기 제한 byte크기 (int) 100*1024*1024
encoding설정 (String) "UTF-8"
동일한 파일명에 대한 처리 방식 (FileRenamePolicy) new DefaultFileRenamePolicy()

DefaultFileRenamePolicy 는 보통 우리에게 친숙한 파일명 설정방식이다. 동일한 파일이름이 존재한다면,

  • test1.jpg
  • test2.jpg
  • test3.jpg

이렇게 숫자를 붙여서 새로운 파일처럼 업로드될 디렉토리에 파일을 저장하는 것을 의미한다.

 

아래 코드를 보면 MultipartRequest 객체를 받아오는 짦은 코드이지만 이 과정에서 업로드는 완료된다. 지정한 디렉토리를 가보면 업로드가 잘 되어있을 것이다.

<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% 
    String directory = "D:/JSP_workspace/JSP_fileUpload/WebContent/uploaded";
	int sizeLimit = 100*1024*1024;		//100MB 제한
	
	MultipartRequest multi = new MultipartRequest(request, 
						directory, 
                                                sizeLimit,
                                                "UTF-8",
                               	                new DefaultFileRenamePolicy() );
%>	

혹시 업로드가 잘 되지 않는 경우 eclipse가 구동중인 workspace를 가보면 현재 실행중인 웹 프로젝트를 찾을 수 있다. webContent 폴더에서 파일이 저장될 경로를 설정해주면 잘 저장된다.

 

참고로 MultipartRequest  객체를 사용하기 위해서는 import 가 필요하니 확인하자

  • <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
  • <%@page import="com.oreilly.servlet.MultipartRequest"%>

 


MultipartRequest 기능 활용하기

 

주요 메서드

메서드 내용
String getContentType(String name) 어떤 형식의 파일인지 리턴
File  getFile(String name) File 형식으로 리턴
Enumeration  getFileNames() Enumeration 형식으로 업로드된 파일 이름들을 리턴
String  getFilesystemName(String name) 업로드된 파일이름 리턴
(동일한 파일이 존재하는 경우 파일이름이 변경됨)
String  getOriginalFileName(String name) 원본 파일이름 리턴
(실제로 업로드한 파일의 원본 이름)
String  getParameter(String name) 인자값 받아오기
request.getParameter() 와 동일한 기능 수행
Enumeration  getParameterNames() Enumeration 형식으로 인자값들 가져오기
String[]  getParameterValues(String name) 복수의 값들을 선택할 수 있는 경우, 값들 가져오기
(예를들어 checkbox에 사용할 수 있음)

 

 

코드 예제

MultipartRequest를 이용해서 form으로 전송하는 값을 받아온다. 참고로 enctype="multipart/form-data" 지정때문에 request.getParameter(...) 메서드는 사용할 수 없다. 대신 MultipartRequest 객체에서 제공하는 메서드로 받아올 수 있다.

 

아래 내용을 form 으로 입력받아서 MultipartRequest 객체의 메서드를 사용해 받아오자.

  • parameter 전달값
  • 업로드한 파일
  • checkbox 체크값

 

코드 진행

form.jsp 파일에서 폼에 입력한 내용을 form_result.jsp 파일에서 읽기

 

 

코드 - form.jsp

파일을 생성해 값을 입력받도록 한다

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
	<h1>form</h1>
	<form action="form_result.jsp" method="post" enctype="multipart/form-data">
		<p>parameter1: <input type="text" name="param1"></p>
		<p>parameter2: <input type="text" name="param2"></p>
		<p>parameter3: <input type="text" name="param3"></p>

		<p>file 1 : <input type="file" name="file1"></p>
		<p>file 2 : <input type="file" name="file2"></p>
		<p>file 3 : <input type="file" name="file3"></p>		
		
		<p>hobby : 
			<input type="checkbox" name="hobbies" value="movies">영화감상
			<input type="checkbox" name="hobbies" value="bike">자전거	
			<input type="checkbox" name="hobbies" value="walk">산책

		<p><input type="submit" value="전송"></p>	
	</form>	
</body>
</html>

 

 

form.jsp - 실행 화면

 

 


 

폼으로 입력한 내용을 확인해보자.

 

parameter key 값들 가져오기 - getParameterNames()

	System.out.println("--getParameterNames");
	Enumeration enumeration01 = multi.getParameterNames();
	while(enumeration01.hasMoreElements()){
		System.out.println(enumeration01.nextElement());
	}

 

실행 결과

- 마지막에 할당된 값부터 순서대로 나온다. 자료구조 중 Stack 에 대해 떠오를 것이다.

--getParameterNames
hobbies
param3
param2
param1

 

 

 

 

file key 값들 가져오기 - getFileNames()

	System.out.println("--getFileNames");
	Enumeration enumeration02 = multi.getFileNames();
	while(enumeration02.hasMoreElements()){
		System.out.println(enumeration02.nextElement());
	}

 

실행 결과

--getFileNames
file3
file2
file1

 

 

 

parameter key 로 전달해준 값(value) 받아오기 - getParameter()

- request.getParameter() 메서드로 값을 받아올 수가 없기 때문에 자체 제공되는 메서드를 사용한다. 사용방법은 request 객체를 사용하는 방법과 같다.

	System.out.println("--getParameter");
	String parameter01 = multi.getParameter("param1");
	String parameter02 = multi.getParameter("param2");
	String parameter03 = multi.getParameter("param3");
	System.out.println(parameter01);
	System.out.println(parameter02);
	System.out.println(parameter03);

 

실행 결과

--getParameter
12
34
56

 

 

 

업로드하려는 파일의 원본이름을 가져오기 - getOriginalFileName()

	System.out.println("--getOriginalFileName");
	String ori1 = multi.getOriginalFileName("file1");
	String ori2 = multi.getOriginalFileName("file2");
	String ori3 = multi.getOriginalFileName("file3");
	System.out.println(ori1);
	System.out.println(ori2);
	System.out.println(ori3);

 

실행 결과

--getOriginalFileName
cherryBlossom.png
chihiro.jpg
helloworld.txt

 

 

 

 

시스템에 저장된 파일이름을 가져오기 - getFilesystemName()

- 중복된 파일이 존재하는 경우 이름이 변경되어 저장된다

	System.out.println("--getFilesystemName");
	String fileSysName01 = multi.getFilesystemName("file1");
	String fileSysName02 = multi.getFilesystemName("file2");
	String fileSysName03 = multi.getFilesystemName("file3");
	System.out.println(fileSysName01);
	System.out.println(fileSysName02);
	System.out.println(fileSysName03);	

 

실행 결과

- 파일이름이 변경된 것을 확인할 수 있다.

--getFilesystemName
cherryBlossom.png
chihiro2.jpg
helloworld3.txt

 

 

 

 

checkbox 에서 선택한 값 가져오기 - getParameterValues()

- String[] 배열 형태로 리턴된다

	System.out.println("--getParameterValues");
	String[] strValues = multi.getParameterValues("hobbies");
	for(String s : strValues){
		System.out.println(s);
	}

 

실행 결과

--getParameterValues
movies
bike

 


 

코드 - form_result.jsp

전체 코드는 아래와 같다.

<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
	String directory = "D:/Programming/workspace/dynamicWebProject/JSP_fileUpload/WebContent/uploaded";
	int sizeLimit = 100*1024*1024;	
	
	MultipartRequest multi = new MultipartRequest(request, directory, sizeLimit, "UTF-8", new DefaultFileRenamePolicy() );
	
	System.out.println("--getFileNames");
	Enumeration enumeration01 = multi.getFileNames();
	while(enumeration01.hasMoreElements()){
		System.out.println(enumeration01.nextElement());
	}
	
	System.out.println("--getParameterNames");
	Enumeration enumeration02 = multi.getParameterNames();
	while(enumeration02.hasMoreElements()){
		System.out.println(enumeration02.nextElement());
	}	
	
	System.out.println("--getOriginalFileName");
	String ori1 = multi.getOriginalFileName("file1");
	String ori2 = multi.getOriginalFileName("file2");
	String ori3 = multi.getOriginalFileName("file3");
	System.out.println(ori1);
	System.out.println(ori2);
	System.out.println(ori3);
		
	System.out.println("--getParameter");
	String parameter01 = multi.getParameter("param1");
	String parameter02 = multi.getParameter("param2");
	String parameter03 = multi.getParameter("param3");
	System.out.println(parameter01);
	System.out.println(parameter02);
	System.out.println(parameter03);
	
	System.out.println("--getFilesystemName");
	String fileSysName01 = multi.getFilesystemName("file1");
	String fileSysName02 = multi.getFilesystemName("file2");
	String fileSysName03 = multi.getFilesystemName("file3");
	System.out.println(fileSysName01);
	System.out.println(fileSysName02);
	System.out.println(fileSysName03);		
	
	System.out.println("--getParameterValues");
	String[] strValues = multi.getParameterValues("hobbies");
	for(String s : strValues){
		System.out.println(s);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>form result</title>
</head>
<body>
	<h1>form result</h1>
</body>
</html>

 

 

 

 

MultipartRequest 에 대한 자세한 정보를 원한다면 웹 페이지에서 확인해보자 (☜ api 문서 확인하기)