파일 다운로드시 한글 파일명 처리

Spring Framework 환경에서 파일명이 한글인 경우에 파일명을 인코딩하는 좀 더 세련된 방법은 Content-Disposition 헤더를 설정할 때 파일명을 인코딩하는 과정을 HttpHeaders 객체를 사용하여 처리하는 것입니다. 이때 ContentDisposition 클래스를 활용하여 파일 다운로드 시 사용자에게 제공될 파일명을 인코딩할 수 있습니다. 이 방법은 RFC 5987을 준수하여 파일명을 정확히 인코딩하고, 다양한 브라우저에서 호환성 문제를 최소화할 수 있습니다.

다음은 HttpHeaders를 사용하여 Content-Disposition 헤더를 설정하고 파일명을 인코딩하는 예시입니다:

import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;

import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;

...


        String filePath = file.getFilePath();       // 파일 경로
        String fileName = file.getFileName();       // 파일 이름

        // 다운로드 응답을 위한 헤더 세팅
        // - ContentType            : application/octet-stream
        // - Content-Disposition    : attachment, filename="파일명.확장자"

        // 한글인경우 파일명 인코딩 필요함
        // Content-Disposition 헤더 설정
        ContentDisposition contentDisposition = ContentDisposition.builder("attachment")
            .filename(fileName, StandardCharsets.UTF_8)
            .build();

        // HttpHeaders 객체 생성 및 설정
        HttpHeaders headers = new HttpHeaders();
        headers.setContentDisposition(contentDisposition);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        // 응답 헤더에 추가
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, headers.getContentDisposition().toString());
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);

위 코드에서는 ContentDisposition.builder(“attachment”)를 사용하여 파일 다운로드 시 attachment 유형의 Content-Disposition 헤더를 생성합니다. .filename(fileName, StandardCharsets.UTF_8) 메소드는 파일명을 UTF-8 인코딩으로 처리하여 다국어 파일명에 대한 호환성을 개선합니다.

이 방법을 사용하면, 직접 인코딩 처리를 하는 것보다 Spring의 기능을 활용하여 더 깔끔하고 안정적인 방식으로 파일명 인코딩 문제를 해결할 수 있습니다. 또한, 이 방식은 다양한 브라우저에서의 호환성을 고려한 설계로, 파일 다운로드 기능을 구현할 때 일반적인 문제들을 효과적으로 방지할 수 있습니다.