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의 기능을 활용하여 더 깔끔하고 안정적인 방식으로 파일명 인코딩 문제를 해결할 수 있습니다. 또한, 이 방식은 다양한 브라우저에서의 호환성을 고려한 설계로, 파일 다운로드 기능을 구현할 때 일반적인 문제들을 효과적으로 방지할 수 있습니다.