본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/JAVA

파일 업로드, 용량 제한하기

by 미노드 2016. 3. 3.

아직까지 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] 파일 업로드|작성자 냐카오