웹페이지에서 파일 업로드 기능을 구현하는 방법은 여러가지가 있는데, 그중에서 cos.jar를 이용하는 방법이 꽤 간편한 방법인 듯 하다.
cos.jar 파일 다운로드
www.servlets.com 접속하기(☜ 새창에서 열기)
( 혹은 첨부된 파일 다운로드 )
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 문서 확인하기)
'웹 개발 > 설정 및 오류해결' 카테고리의 다른 글
[eclipse error] com.microsoft.sqlserver.jdbc.SQLServerException (0) | 2022.09.03 |
---|---|
[웹 설정] 톰캣(tomcat) server.xml 설정하기 (1) | 2022.07.16 |
[Eclipse] Data Source Explorer 이용하여 SQL 실행하기 (0) | 2021.06.26 |
[Eclipse] Data Source Explorer 이용하여 DB(MySQL) 연결하기 (update.2021-11-12) (0) | 2021.06.26 |
[eclipse조치] Multiple Context have a path of ### (0) | 2021.06.18 |