Post

05 File Upload

05 File Upload

1. 파일업로드 - http

1. 폼(form)과 HTTP

  • HTML <form>은 사용자 입력 데이터를 서버로 전송하는 표준 방법
  • 전송 방식(method)
    • GET → URL 쿼리 스트링으로 전송, 짧은 데이터/검색용
    • POST → 요청 본문(body)에 데이터 전송, 대용량/보안 데이터 업로드에 적합

2. http 예시

1
2
3
4
5
6
7
 // 파일 업로드는 반드시 enctype="multipart/form-data"로 지정해야 함.
 // Post로만 사용
 <form action="upload.do" method="post" enctype="multipart/form-data">
     이름: <input type="text" name="username"><br>
     파일: <input type="file" name="uploadFile"><br> //타입을 파일로 설정
     <input type="submit" value="업로드">
 </form>

2. COS.jar 방식

1. COS.jar

  • cos.jar의 정확한 명칭은 “com.oreilly.servlet”로, 이는 O’Reilly Servlet Package의 일부
  • COS는 JSP(Java Server Pages) 환경에서 파일 업로드 기능을 구현하기 위해 사용되는 자바 라이브러리
  • 이 라이브러리는 multipart/form-data 형식으로 전송된 파일 데이터를 처리하는 데 특화되어 있음.

2. 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    String saveDir = "C:/upload"; // 업로드 저장 경로
    int maxSize = 10 * 1024 * 1024; // 크기 10MB 
    String encoding = "UTF-8";

    MultipartRequest multi = new MultipartRequest(
        request,                // 원래 HttpServletRequest
        saveDir,                // 저장 디렉토리
        maxSize,                // 업로드 제한 크기
        encoding,               // 인코딩
        new DefaultFileRenamePolicy() // 중복 파일명 처리 정책
    );

    // 파일명 추출
    String fileName = multi.getFilesystemName("uploadFile");
    String originalName = multi.getOriginalFileName("uploadFile");

}

3. Servlet 3.0 이후버전

1. @MultipartConfig 방식

  • Java EE 6 (2009)에 포함되면서 표준 API로 파일 업로드 지원
  • 특징
    • @MultipartConfig 애노테이션으로 서블릿에 설정 가능
    • request.getPart(“file”) 또는 request.getParts()로 파일/폼 데이터를 쉽게 가져올 수 있음
    • 임시 디렉터리, 최대 파일 크기 등 업로드 제약 조건도 설정 가능
    • 별도의 외부 라이브러리 없이 서블릿 자체로 multipart 처리 가능

2. 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@WebServlet("/upload")
@MultipartConfig( // 기존에 
    fileSizeThreshold = 1024 * 1024,  // 1MB
    maxFileSize = 1024 * 1024 * 10,   // 10MB
    maxRequestSize = 1024 * 1024 * 50 // 50MB
)
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Part filePart = request.getPart("file");
        String fileName = Path.of(filePart.getSubmittedFileName()).getFileName().toString();
        filePart.write("/upload/" + fileName);
        response.getWriter().println("Upload complete: " + fileName);
    }
}

4. COS.jar -> selrvet 3.0

1. 변화

  • 변수가 코드에서 직접 지정 → 애노테이션으로 선언만 하면 Servlet이 알아서 처리로 바뀐 것
구분cos.jarServlet 3.0 이후
설정 위치코드 안 / web.xml애노테이션
라이브러리외부 필요 (cos.jar 등)표준 API 내장
코드 복잡도상대적으로 길고 반복적간결, 자동 처리
제어 수준세밀하게 조정 가능애노테이션 속성 범위 내

2. 장단점

구분cos.jarServlet 3.0 이후 (@MultipartConfig)
설정 방식코드 안에서 MultipartRequest 객체 생성, 파일 경로·크기 직접 지정@MultipartConfig 애노테이션으로 서블릿 위에서 설정, 자동 처리
라이브러리 필요성외부 라이브러리 필요서블릿 표준 API 내장, 별도 라이브러리 불필요
코드 복잡도상대적으로 길고 반복적간결, request.getPart()로 자동 파싱
파일 처리 제어세밀하게 가능 (파일 이름, 경로, 스트림 직접 처리)애노테이션 속성 범위 내에서만 제어 가능
호환성Servlet 3.0 이전 환경에서도 사용 가능Servlet 3.0 이상 필요
장점- 구형 서버에서도 사용 가능
- 세밀한 커스터마이징 가능
- 코드 간결
- 외부 라이브러리 불필요
- 표준 API로 안정적
단점- 코드가 장황
- 예외 처리 및 스트림 관리 복잡
- 유지보수 어려움
- 세밀한 커스터마이징은 제한적
- 구형 서버에서는 사용 불가
This post is licensed under CC BY 4.0 by the author.