Java SE 파일 업로드 및 다운로드의 원리

1. Java SE 파일 업로드 및 다운로드의 기초 메커니즘

파일 전송 기능은 웹 개발에서 흔하게 사용되는 기능입니다. 본 문서에서는 소규모 파일 업로드에 초점을 맞추고 있으며, 대용량 파일 처리는 전용 도구 또는 라이브러리를 사용하는 것이 일반적입니다.

파일 전송을 위해 다음 패키지가 필요합니다:

  • java.io 패키지
  • javax.servlet 패키지
  • org.apache.commons.fileupload 관련 라이브러리

1.1 파일 업로드 원리

업로드 시 주요 설정 요소:

  1. 폼 제출 방식: POST 메서드 사용 필수
  2. 인코딩 타입: multipart/form-data 지정 (이진 데이터 전송 지원)
  3. 서버 측 처리: 파일 항목별 구분 처리 및 저장 경로 관리

핵심 코드 구조:


// 파일 업로드 처리 로직
public void handleUpload(HttpServletRequest request) {
    if (isMultipartContent(request)) {
        FileStorageFactory factory = new FileStorageFactory();
        FormParser parser = new FormParser(factory);
        
        List<FormItem> items = parser.parse(request);
        for (FormItem item : items) {
            if (item.isBinary()) {
                String fileName = generateUniqueFileName(item.getName());
                saveToDisk(item.getInputStream(), fileName);
            } else {
                String textValue = item.getString();
                // 텍스트 값 처리 로직
            }
        }
    }
}

1.2 파일 다운로드 원리

다운로드 시 주요 응답 헤더:

  1. Content-Disposition: 파일 다운로드 지시 (attachment) 또는 내부 표시 (inline)
  2. Content-Type: MIME 타입 지정 (ex: image/png)

핵심 코드 구조:


// 파일 다운로드 처리 로직
public void handleDownload(HttpServletRequest request, HttpServletResponse response) {
    String fileName = request.getParameter("filename");
    
    // MIME 타입 조회
    String mimeType = getMimeType(fileName);
    response.setContentType(mimeType);
    
    // 브라우저 호환성 처리
    if (isFirefox(request)) {
        setBase64FilenameHeader(response, fileName);
    } else {
        setUrlEncodedFilenameHeader(response, fileName);
    }
    
    // 파일 스트림 전송
    InputStream inputStream = getResourceAsStream(fileName);
    IOUtils.copy(inputStream, response.getOutputStream());
}

2. 실무 적용 사례

2.1 파일 업로드 예제

JSP 폼 예시:


<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" onchange="previewImage(this)" />
    <input type="text" name="description" />
    <input type="submit" value="업로드" />
</form>

Servelt 처리 로직:


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    try {
        List<FormItem> items = parseRequest(request);
        for (FormItem item : items) {
            if (!item.isBinary()) {
                // 텍스트 입력 처리
            } else {
                // 파일 저장 로직
                String savedPath = saveFile(item.getInputStream(), 
                    generateUniqueFileName(item.getName()));
                response.getWriter().write("파일 저장 완료: " + savedPath);
            }
        }
    } catch (Exception e) {
        // 오류 처리
    }
}

2.2 파일 다운로드 예제

다운로드 링크 예시:


<a href="/download?file=report.pdf">보고서 다운로드</a>

Servelt 처리 로직:


@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String fileName = request.getParameter("file");
    
    // 파일 존재 여부 확인
    if (fileExists(fileName)) {
        // 다운로드 헤더 설정
        setDownloadHeaders(response, fileName);
        
        // 파일 전송
        transferFile(fileName, response.getOutputStream());
    } else {
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
    }
}

3. 고급 고려 사항

  • 대용량 파일 처리: 분할 전송, 프로세스 관리
  • 보안 처리: 파일 확장자 검증, 크기 제한
  • 브라우저 호환성: 인코딩 방식 자동 감지
  • 효율적인 저장 경로: 시간 기반 폴더 구조

4. 결론

본 문서에서는 Java SE 기반의 파일 전송 기능의 핵심 원리를 설명했습니다. 실제 개발에서는 Spring MVC 등 프레임워크를 사용하여 보다 효율적으로 처리할 수 있습니다. 하지만 이 기초 원리는 현대 웹 애플리케이션에서 파일 처리 기능을 이해하는 데 중요한 역할을 합니다.

태그: Java SE Servlet JSP multipart/form-data 파일 업로드

5월 26일 10:06에 게시됨