아직까지 JSP는 잘 모른다.
그래도 해보자.
1. 파일 업로드 api 사용하기 (아파치와 연동했을 때 사용하는 방법같다.)
http://commons.apache.org/downloads/download_fileupload.cgi 에 가셔서 다운을 받으시거나
첨부 파일을 받으세요. 받으신 파일 압축을 푸시면 commons-fileupload-1.2.1.jar 파일과
commons-io-1.4.jar 파일이 있습니다. 그 파일들을 WEB-INF/lib에 넣어주세요..
※ commons-fileupload- 1.0, 1.1 버젼에서는 fileupload.jar파일만 있으면 사용가능했으나
1.2 부터는 io파일도 같이 사용해야 합니다.
FileUpload API를 쓸준비가 되었군요.
FileUpload API를 사용하실 때 기본적으로 post 전송방식을 사용하셔야 하구요 post의 인코딩은
application/x-www-form-urlencoded (DEFAULT 입니다.) 가 아닌
multipart/form-data 를 사용하셔야 된다는 것!!!
<form action="......." method="post" enctype="multipart/form-data">
업로드 처리는 org.apache.common.fileupload 패키지의 DiskFileUpload를 사용을 하겠습니다.
그럼 간단한 코딩을 조금 해보도록 하죠~! ^^
파일은 2개가 되구요. 하나는 값을 보내는 폼과 받는 폼을 만들어서 작업하겠습니다.
fileupload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일업로드</title>
</head>
<body>
<form action="fileupload_view.jsp" method="post" enctype="multipart/form-data">
파일1 : <input type="file" name="file1"><br>
파일2 : <input type="file" name="file2"><br>
파라미터1 : <input type="text" name="param1"><br>
파라미터2 : <input type="text" name="param2"><br>
<input type="submit" value="ok">
</form>
</body>
</html>
=============================
fileupload_view.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | fileupload_view.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="java.io.*"%> <%@ page import="java.util.*"%> <% if (FileUpload.isMultipartContent(request)) { // 인코딩이 multipart/form-data로 했다면 true String temDir = "C:\\temp"; // 파일이 저장될 절대 주소 DiskFileUpload fileUpload = new DiskFileUpload(); // DiskFileUpload로 처음부터 디스크에 업로드한 파일을 저장하는게 아니라 우선 메모리에 // 저장을 해둔다. fileUpload.setRepositoryPath(temDir); // setSizeThreshold의 크기를 벗어나게 되면 지정한 위치에 임시로 저장한다. fileUpload.setSizeMax(1024 * 1024); // 최대 1메가까지 업로드 가능 (1024 * 1024 * 100) <- 100MB fileUpload.setSizeThreshold(1024 * 100); // 한번에 100k 까지는 메모리에 저장 if(request.getContentLength() < fileUpload.getSizeMax()) { // setSizeMax보다 크지 않다면 실행한다. (파일 용량 체크) List fileItemList = fileUpload.parseRequest(request); // parseRequest()는 FileItem을 포함하고 있는 List타입의 리턴한다. int Size = fileItemList.size(); // fileupload.jsp에서 받은 값들의 갯수를 구한다. for (int i = 0; i < Size; i++) { FileItem fileItem = (FileItem) fileItemList.get(i); if (fileItem.isFormField()) { // isFormField()를 통해서 파일형식인지 파라미터인지 구분한다. 파라미터라면 true out.print("폼 파라미터 : " + fileItem.getFieldName() + " = " + fileItem.getString("UTF-8") + "<br>"); } else { // 파일형식이면.. out.print("파일 : " + fileItem.getFieldName() + " = " + fileItem.getName()); out.print("(" + fileItem.getSize() + " byte)<br>"); if(fileItem.isInMemory()) { // 메모리에 저장중이면 true, 아니면 false out.print("메모리에 저장<br>"); } else { out.print("디스크에 저장<br>"); } if (fileItem.getSize() > 0) { // 파일을 저장하는 if int idx = fileItem.getName().lastIndexOf("\\"); // getName()은 경로를 다 가져오기 때문에 lastIndexOf로 잘라냄 if (idx == -1) { idx = fileItem.getName().lastIndexOf("/"); } String fileName = fileItem.getName().substring( idx + 1); try { File uploadedFile = new File(temDir, fileName); fileItem.write(uploadedFile); } catch (IOException e) { System.out.println(e);} } }//else }//for } else { // 업로드하는 파일이 setSizeMax보다 크다면. int overSize = (request.getContentLength() / 1000000); out.print("<script>alert('파일의 크기는 1MB까지 입니다. 올리신 파일 용량은" + overSize + "MB입니다');"); out.print("history.back();</script>"); } } else { out.print("인코딩 타입이 multipart/form-data가 아니야"); } %> | cs |
보고 작업하실 때는 fileupload_view.jsp 파일 temDir의 경로를 설정해주세요
[출처] [JSP] commons FileUpload API를 이용한 파일 업로드처리!|작성자 Fightit
2. cos라이브러리 사용하기
업로드 관련해서 폼 태그의 기본 HTML 형식은 아래와 같습니다.
<form method="post" enctype="multipart/form-date">
<input type="file" name="filename">
</form>
폼 태그를 자세히 보면 enctype 속성이 multipart/form-data로 설정되어 있는 것을 확인할 수 있습니다.
만약 위와 같이 지정하지 않으면 데이터를 보내는데, GET방식과 POST방식에 용량이 제한되기 때문에 큰 데이터의 파일을
전송할 수 없게됩니다. 큰 데이터 파일을 전송하기 위한 폼태그의 속성입니다.
COS 라이브러리
: 업로드 모듈을 직접 구현할 수 있지만 jsp에서는 가장 잘알려지고 안정성있는 업로드 모듈입니다.
다운로드 경로 : http://www.servlets.com 사이트 접속 -> com.oreilly.servlet 메뉴 클릭 -> cos-26Dec2008.zip 다운로드
COS 라이브러리는 MultipartRequest 클래스를 제공합니다.
MultipartRequest 클래스는 다음과 같은 생성자를 가지고 있습니다.
MultipartRequest( javax.servlet.http.HttpServletRequest request,
java.lang.String saveDirectory,
int maxPostSite,
javax.lang.String encoding,
FileRenamePolicy policy )
[ MultipartRequest 생성자의 인자들의 역할 ]
인자 |
설명 |
request |
MultipartRequest와 연결할 request 객체를 의미합니다. |
saveDirectory |
서버 측에 저장될 경로를 의미합니다. |
maxPostSize |
최대 파일 크기를 의미합니다. |
encoding |
파일의 인코딩 방식을 의마합니다. |
policy |
파일 중복 처리를 위한 인자를 의미합니다. |
[ MultipartRequest 클래스의 메소드 ]
메소드명 |
설명 |
getParameterNames() |
폼(form)에서 전송된 파라미터의 이름을 Enumeration 타입으로 리턴합니다. |
getParameterValues() |
폼에서 전송된 파라미터들의 배열로 받아옵니다. |
getParameterRequest() |
객체에 있는 해당 파라미터의 값을 가져옵니다. |
getFileNames(); |
파일을 여러 개 업로드 할 경우 그 값들을 Enumeration 타입으로 리턴합니다. |
getFilesystemName() |
서버에 실제 업로드된 파일의 이름을 의미합니다. |
getOriginalFileName() |
클라이언트가 업로드한 파일의 원본 이름을 의미합니다. |
getContentType() |
업로드 파일의 컨텐츠 타입을 얻을 때 사용합니다. |
getFile() |
서버에 업로드된 파일의 정보를 개체로 얻어낼 때 사용합니다. |
그럼 아래 화면을 통해 COS 라이브러리를 통한 파일 업로드가 어떻게 사용되는지 확인 해보겠습니다.
[ fileUploadForm 소스 화면입니다. ]
<form> 태그의 enctype 속성을 사용하면 파일 대용량의 파일 업로드를 가능하게 했습니다.
[ fileUploadAction 소스 화면입니다. ]
1. multiPartRequest 클래스의 생성하여 request를 통해 이전 폼에서 작성한 파일을 받아 uploadPath 변수 지정한 경로에
저장합니다.
2. Enumeration 타입의 files 변수에 저장된 파일의 값들을 가져옵니다.
file.nextElement() 메소드를 통해 파일위치를 지정하고 그 해당 파일의 위치에 있는 파일을
getFilesystemName("파일 값")을 통하여 해당 파일의 실제 업로드된 파일명을 가져옵니다.
위의 생성자를 확인하시어 각 생성자의 역할을 한번더 보시면되겠습니다.
※ 업로드 하기전 업로드 폴더가 먼저 생성되어 있어야합니다. 이클립스 경우 아래 경로에 파일이 업로드되어있습니다.
=> .metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\default\upload
[ fileUploadCheck 소스 화면입니다. ]
위의 화면을 통해 결과를 확인하시면 됩니다.
그럼 아래 화면을 통해 브라우저에서 어떻게 실행되는지 확인해보겠습니다.
[ 화면 1 ]
위의 fileUploadForm 소스의 화면으로 파일 업로드의 할 수 있는 화면입니다.
[ 화면 2 ]
파일 업로드 폼의 양식에 맞춰서 입력해보겠습니다.
전송 버튼을 클릭하여 파일 업로드해보겠습니다.
[ 화면 3 ]
파일 업로드가 정상적으로 끝이 나면 결과확인할 수 있는 페이지가 나옵니다.
[ 화면 4 ]
결과 확인버튼을 클릭하면 나오는 화면으로 정상적으로 결과가 처리되었다는걸 확인하실 수 있습니다
[출처] [jsp] 파일 업로드|작성자 냐카오
'IT기술 > JAVA' 카테고리의 다른 글
자바/java 클래스 디컴파일러 jad (0) | 2016.03.09 |
---|---|
Spring <c:choose>가 무엇이냐? (0) | 2016.03.09 |
이클립스에서 프로젝트 복사하기 (0) | 2016.03.02 |
클래스 메서드(static 메서드)와 인스턴스 메서드 (0) | 2016.02.12 |
소스 분석하기 (0) | 2016.02.11 |