Java 파일 확장자 구하는 방법
파일 확장자(filename extension)는 컴퓨터 파일의 이름에서 파일의 종류와 그 역할을 표시하기 위해 사용하는 부분으로, 간단히 확장자라고도 하는데요. 확장자는 파일 이름에서 마지막 마침표(.) 뒤에 나타나는 부분을 확장자로 인식합니다. (wikipedia)
아래 내용을 통해 자바(및 스프링)에서 파일 확장자를 구하는 몇 가지 방법에 대해서 살펴보겠습니다.
1. subString() 메서드와 lastIndexOf() 메서드를 사용한 방법
public String getExtension(MultipartFile multipartFile) {
String fileName = multipartFile.getName();
String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
return extension;
}
첫 번째 방법은 java 코드만을 가지고 확장자를 가져오는 방법입니다.
파일 이름에서 마침표(.)를 기준으로 뒤에 나타나는 부분을 확장자로 인식하기 때문에 lastIndexOf() 메서드를 통해 마침표(.)가 있는 index를 파악하고 substring() 메서드를 통해 마침표(.) 뒷부분을 자르는 방식입니다.
(해당 예시 및 아래 예시들에서는 MultipartFile 뿐만 아니라 File 클래스에도 똑같은 방식으로 확장자를 가져올 수 있습니다.)
/*
- public int lastIndexOf(String str)
파라미터로 전달된 str이 나타나는 마지막 index를 반환합니다.
- public String substring(int beginIndex)
beginIndex부터 마지막까지 문자열을 잘라서 반환합니다.
*/
2. Commons-io 라이브러리를 사용하는 방법
import org.apache.commons.io.FilenameUtils;
public String getExtension(MultipartFile multipartFile) {
String extension = FilenameUtils.getExtension(multipartFile.getName());
return extension;
}
외부 라이브러리를 사용해야 하지만 apache.commons.io 라이브러리를 사용하면 FilenameUtils 클래스의 getExtension() 메서드를 통해 쉽게 확장자를 가져올 수 있습니다.
/*
- public static String getExtension(String filename)
마지막 마침표(.)를 기준으로 뒤에 있는 파일 이름을 반환합니다. 마침표 뒤에 디렉터리 구분자(/)가 없어야 하며 null 또는 ""(empty string)을 반환할 수 있습니다.
*/
3. Spring Framework
import org.springframework.util.StringUtils;
public String getExtension(MultipartFile multipartFile) {
String extension = StringUtils.getFilenameExtension(multipartFile.getOriginalFilename());
return extension;
}
Spring Framework를 사용한다면 외부 라이브러리 추가 없이도 springframework 내부에 StringUtils의 메서드를 통해 파일 확장자를 가져올 수 있습니다.
/*
- public static String getFilenameExtension(@Nullable String path)
파라미터로 들어온 리소스 경로에서 파일 이름 확장자를 추출합니다. 파라미터로 null이 들어올 있으며, 결과 값으로 null이 반환될 수 있습니다.
*/
4. getContenType() 메서드를 통한 방법
public String getExtension(MultipartFile multipartFile) {
String contentType = multipartFile.getContentType();
String extension;
//파일의 Content Type 이 있을 경우 Content Type 기준으로 확장자 확인
if (StringUtils.hasText(contentType)) {
if(contentType.equals("image/jpeg")){
extension = "jpg";
}
else if(contentType.equals("image/png")){
extension = "png";
}
else if(contentType.equals("image/gif")){
extension = "gif";
}
}
else {
// contentType 존재하지 않는 경우 처리
}
return extension;
}
마지막으로 getContentType() 메서드를 통해 확장자를 구하는 예시입니다.
다음과 같이 MultipartFile 인터페이스의 getContentType() 메서드를 통해 리소스의 Media Type(= MIME Type)을 확인할 수 있는데요. media type을 통해 해당 타입의 확장자를 구하는 방법도 있습니다.
(해당 방식은 MultipartFile에서 사용할 수 있는 방식입니다.)
MIME Type에 따른 확장자는 아래에서 확인할 수 있습니다.
https://www.htmlstrip.com/mime-file-type-checker
***
getContentType() 메서드에서 주의해야 할 부분은 파일의 확장자를 임의로 바꾸었을 때 getContentType() 메서드의 결과도 바뀐다는 것입니다.
예를 들어 확장자가 .jpg인 파일의 contentType을 확인했을 때는 "image/jpeg"라는 결과가 나오지만, 해당 파일의 확장자를 임의로 .text로 바꾸어 다시 contentType을 확인해 보면 "text/plain"이 나오게 됩니다.
때문에 파일의 정확한 확장자를 확인하려고 할 때는 Apache Tika 등의 다른 라이브러리를 사용해야 합니다.
(Apache Tika는 컨텐츠 감지 및 분석 프레임워크로 MIME 유형 분류에서 1400개 이상의 파일 유형을 식별하는 기능을 제공합니다.)
< 관련 자료 >
2022.10.17 - [Programming/Spring Boot] - MultipartFile to File 차이점과 변환 방법(Java)
'Programming > Java' 카테고리의 다른 글
JSch를 이용한 java sftp 파일 업로드 구현 (0) | 2023.02.18 |
---|---|
Java FTPClient를 통한 ftp 파일 업로드 내용 정리 (0) | 2023.02.13 |
FTP로 살펴보는 SocketTimeout(soTimeout)과 ConnectionTimeout 차이점 (0) | 2023.02.01 |
(java) Enum field에 Enum List를 사용하며 발생한 코드 리팩토링 (0) | 2023.01.13 |
@PostConstruct 어노테이션을 통한 스프링 빈(Bean) 초기화 콜백 (0) | 2023.01.08 |