[JSP] 파일 업로드


파일 전송을 위한 form 태그


웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼(form) 태그 작성

  • form 태그의 method 속성 = POST 여야 함

  • form 태그의 enctype(전송 데이터 형식 설정) 속성 = multipart/form-data

  • form 태그의 action 속성 = 파일 업로드를 처리할 JSP 파일로 설정

  • input 태그의 type 속성 = file로 설정



cos.jar - MultipartRequest


  • 오픈 라이브러리 cos.jar 다운로드 해 사용 (http://servlets.com/cos/)

  • JSP 페이지에 디렉티브 태그 import 속성 사용 > com.oreilly.servlet.*

  • webabb(webContent) > WEB-INF > lib 폴더 안에 cos.jar 파일 위치

  • MultipartRequset 클래스 생성 / MultipartRequset 생성자의 매개변수

      MultipartRequest(
                      javax.servlet.http.HttpServletRequest request,
                      java.lang.String saveDirectory,
                      int maxPostSize,
                      java.lang.String encoding,
                      FileRenamePolicy policy
                      )
    
    • request : Request 내장 객체 설정

    • saveDirectory : 서버의 파일 저장 경로 설정

    • maxPostSize : 파일의 최대 크기(바이트 단위) 설정

    • encoding : 인코딩 유형 설정

    • policy : 파일명 변경 방법 설정, saveDirectory에 파일이 중복되는 경우 덮어쓰기 여부, 설정하지 않을 시에 파일명 덮어씀

  • MultipartRequest 메소드

    • 웹 브라우저에서 전송되는 요청 파라미터

      • 일반 데이터는 getParameter()로 메소드 값 받음

      • 파일은 getFileNames() 메소드 이용하여 데이터를 받음

    • String getContentType(String name) : 업로드된 파일의 콘텐츠 유형 반환, 파일이 없다면 null 반환

    • String getParameter(String name) : 요청 파라미터 이름이 name인 값을 전달받음

    • java.util.Enumeration getParameterNames() : 요청 파라미터 이름을 Enumeration 객체 타입으로 반환

    • java.io.File getFile(String name) : 서버에 업로드된 파일에 대한 파일 객체 반환, 파일이 없으면 null 반환

    • java.util.Enumeration getFileNames() : input 태그 내 type 속성 값이 file로 설정된 요청 파라미터의 이름을 반환

    • String getFilesystemName(String name) : 사용자가 설정하여 서버에 실제 업로드된 파일명 반환, 파일명 중복 시 변경된 파일명 반환

    • String getOriginalFineName(String name) : 사용자가 업로드한 실제 파일명 반환, 파일명 중복 시 변경 전의 파일명 반환



Commons-FileUpload


  • 파일 업로드 패키지

  • 서버의 메모리상에서 파일 처리가 가능하도록 지원

  • 오픈 라이브러리 파일 commons-fileupload.jar, commons-io.jar 다운로드 해 사용

  • webabb(webContent) > WEB-INF > lib 폴더 안에 commons-fileupload.jar, commons-io.jar 파일 위치

  • JSP 페이지에 page 디렉티브 태그 import 속성 사용, org.apache.commons.fileupload.* 설정

  • DiskFileUpload 클래스 메소드

    • setRepositoryPath(String repositoryPath) : 업로드된 파일을 임시 저장 할 디렉토리 설정

    • setSizeMax(long sizeMax) : 최대 파일 크기 설정

    • setSizeThreshold(int sizeThreshold) : 메모리상에 저장할 최대 크기 설정

    • parseRequest(HttpServletRequest req) : multipart/form-data 유형의 요청 파라미터를 가져옴

  • FileItem 클래스 메소드

    • boolean isFormField() : 요청 파라미터가 파일이 아닌 일반 데이터인 경우 true 반환

    • String getFieldName() : 요청 파라미터의 이름을 얻음

    • String getString() : 기본 문자 인코딩을 사옹해 요청 파라미터의 값을 얻음

    • String getString(String encoding) : 설정한 문자 인코딩을 사용해 요청 파라미터의 값을 얻음

    • String getName() : 경로 포함 업로드 된 파일의 이름을 얻음

    • long getSize() : 업로드 된 파일의 크기를 얻음

    • byte[] get() : 업로드 된 파일을 바이트 배열로 얻어옴

    • boolean isInMemory() : 업로드 된 파일이 메모리에 저장된 상태 > true 반환, 임시 디렉토리에 저장 > false 반환

    • void delete() : 파일과 관련된 자원 삭제, 메모리상에 저장된 경우 할당된 메모리 반환, 임시 파일로 저장된 경우 파일 삭제

    • void write() : 파일과 관련된 자원 저장

    • String getContentType() : 웹 브라우저가 전송하는 컨텐츠 유형 반환, 정의되어 있지 않은 경우 null 반환



cos.jar를 사용한 파일 업로드 예제


  • FileUpload_Cos.jsp

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html lang="ko">
      <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>파일 업로드 - cos.jar</title>
      </head>
      <body>
          <form action="FileUpload_CosTest.jsp" method="post" enctype="multipart/form-data">
              제목 <input type="text" name="title">
              <br><br>
              파일 <input type="file" name="file">
              <br><br>
              <input type="submit" value="파일업로드">
          </form>
      </body>
      </html>
    
  • FileUpload_CosTest.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"%>
      <!DOCTYPE html>
      <html lang="ko">
      <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>파일 업로드 - cos.jar</title>
      </head>
      <body>
          <%
              MultipartRequest mpreq = new MultipartRequest(
                                      request, 
                                      "C:\\uploadtest", 
                                      10*1024*1024, 
                                      "utf-8", 
                                      new DefaultFileRenamePolicy()
                                      );
            
              Enumeration param = mpreq.getFileNames();
                
              while(param.hasMoreElements()){
                  String name = (String)param.nextElement();
                  String fileName = mpreq.getFilesystemName(name);
                  String originalFileName = mpreq.getOriginalFileName(name);
                    
                  out.println(name + "<br>");
                  out.println(fileName + "<br>");
                  out.println(originalFileName);
              }
          %>
      </body>
      </html>
    
  • 실행결과

    new DefaultFileRenamePolicy() -> 같은 이름의 파일 업로드 시 파일 이름이 변경되어 저장되는 것을 볼 수 있다.

Categories:

JSP/Servlet