commons-fileupload 라이브러리를 통한 파일 업로드를 구현하기 위해서는 라브러리를 다운받아 lib폴더에 넣어주어야 한다.


commons-fileupload-버젼.jar    ( 주소 : http://commons.apache.org/proper/commons-fileupload/ )

commons-id-버젼.jar               ( 주소 : http://commons.apache.org/proper/commons-io/ )



1. 입력 폼 만들기

1
2
3
4
5
6
<form id="go_form" name="go_form" method="post" enctype="multipart/form-data" action="img-upload.jsp">
    이름<input type="text" placeholder="이름을 입력하세요" name="user_name" maxlength="20" id="user_name">
    파일<input type="file" id="user_img" name="user_img">
    <button type="button" id="delFile" onclick="del_file()">파일 삭제</button>
    <button type="submit">submit</button>
</form>
cs

- 입력폼의 method를 POST로 지정하고, enctype 속성의 값을 multipart/form-data로 설정한다.

  사진, 동영상 등 글자가 아닌 파일은 모두 Multipart 형식의 데이터이다. 따라서 파일 업로드 시 enctype 설정을 꼭 해야한다.

- 파일 업로드와 함께 텍스트 형식의 폼 데이터도 함께 전송한다.

- 파일 삭제 버튼을 누르면 업로드했던 파일이 삭제된다.


2. img-upload.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
<%
    // request로 들어온 데이터 저장할 변수 선언
    Map<StringString> user = new HashMap<StringString>();
 
    // 이미지는 서버에 저장
    String saveDir = application.getRealPath("/image/"); // 저장할 경로 지정
 
    // 유효한 request인지 확인
    boolean isMultipart = FileUpload.isMultipartContent(request);
    String fileName = ""// 업로드한 파일의 이름을 저장할 변수 설정
 
    try {
        if(isMultipart) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
 
            // 파일 업로드 핸들러 생성
            ServletFileUpload upload = new ServletFileUpload(factory);
 
            // 한글 인코딩
            upload.setHeaderEncoding("UTF-8");
 
            // request parsing
            List<FileItem> items = upload.parseRequest(request);
            Iterator<FileItem> iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = iter.next();
 
                // 한글 인코딩
                item.getString("UTF-8");
 
                if (item.isFormField()) {
                    // file 형식이 아닐 때
                    String name = item.getFieldName(); // 필드 이름
                    String value = new String((item.getString()).getBytes("8859_1"),"utf-8"); // 필드 값, 한글 인코딩
                    user.put(name,value);
                } else {
                    // file 형식일 때
                    fileName = new File(item.getName()).getName();
                    File storeFile = new File(saveDir + "/"  + fileName);
                    user.put("user_img",fileName);
                    // saves the file on disk
                    item.write(storeFile);
                }
            }
        }
    }
    catch ( Exception e ) { System.out.println(e); }
%>
cs

- ServletFileUpload.isMultipartContent(request) : 전송된 데이터가 multipart/form-data형식으로 전송되었는지 여부 확인

- multipart/form-data 형식으로 넘어온 경우 기존의 request.getParameter("name") 방식으로 값을 꺼낼 수 없기때문에 위의 방법 사용

- FileItem 클래스는 multipart/form-data로 전송된 파라미터 또는 파일 정보를 저장하고 있는 클래스이다.



FileItem 클래스가 제공하는 메소드


메소드 

리턴타입 

설명 

isFormField() 

boolean 

파일이 아닌 일반적인 입력 파라미터일 경우  true를 리턴한다.

getFieldName()

String 

파라미터 이름을 구한다. 

getString()

String 

기본 캐릭터 셋을 사용하여 파라미터의 값을 구한다. 

getString(String encoding) 

String 

지정한 인코딩을 사용하여 파라미터의 값을 구한다.

getName() 

String 

업로드한 파일의 (경로를 제외한) 이름을 구한다.

getSize() 

long 

업로드한 파일의 크기를 구한다. 

write(File file) 

void 

업로드한 파일을 file이 나타내는 파일로 저장한다. 

getInputStream()

inputStream

업로드한 파일을 읽어오는 입력 스트림을 리턴한다.

get()

byte[]

업로드한 파일을 byte배열로 구한다.

isInMemory

boolean

업로드한 파일이 메모리에 저장된 상태인 경우 true를 리턴하고, 임시 디렉터리에 파일로 저장된 경우 false를 리턴한다. 

delete()

void

파일과 관련된 자원을 제거한다. 메모리에 저장된 경우 할당된 메모리를 반환하고 임시 파일로 저장된 경우 파일을 삭제한다.





참고 - https://m.blog.naver.com/PostView.nhn?blogId=javaking75&logNo=220056175936&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

+ Recent posts