Java

[Java]MultipartFile 파일 이름 가져오는 방법

DevStory 2022. 10. 2.

MultipartFile 파일 이름 가져오는 방법

이번 포스팅은 MultipartFile 형식으로 파일 업로드했을 때, 파일 이름을 가져오는 방법을 소개합니다.


getOriginalFilename 메서드

파일 이름을 가져오는 방법은 상당히 심플합니다. MutipartFile 객체에서 getOriginalFilename() 메서드를 호출하면 됩니다.

String originFilename = multipartFile.getOriginalFilename();

getOriginalFilename() 업로드되는 파일에서 확장자를 포함한 파일의 이름을 반환합니다.


getOriginalFilename 메서드의 문제점

파일 이름을 가져오는 getOriginalFilename() 메서드에는 두 가지 문제점이 있습니다.

 

[문제점]

1. IE에서 파일 업로드하는 경우 파일의 전체 경로를 반환합니다.

2. OS마다 파일 이름을 다르게 처리합니다.

 

IE는 걷어내는 추세니깐, 첫 번째 문제점에 대해서는 설명하지 않으며, 이번 포스팅은 두 번째 문제점에 대해 설명하고자 합니다.

 

[실무에서 발생한 이슈]

웹 브라우저에서 파일 업로드 후 BackEnd에서 파일 정보를 추출한 뒤 DataBase에 Insert 하는 과정에서 발생한 이슈입니다.

 

위에서 소개한 getOriginalFilename() 메서드를 사용 후 파일 이름을 가져온 뒤 점(.)을 기준으로 파일명과 확장자를 분리 후 파일명과 확장자를 DataBase에 Insert 했습니다. 여기서 발생한 이슈는 SQL에서 Like 연산자를 사용했을 때, 파일명이 조회되지 않았습니다.

 

여기서 한 가지 패턴이 보였는데, 파일명이 영어 및 숫자인 경우 Like 연산자가 정상적으로 동작했으며, 한글인 경우 Like 연산자가 동작하지 않았습니다.

 

즉, 파일명에 한글이 포함된 경우 발생한 이슈였습니다.

 

참고로 저는 맥(Mac)에서 개발을 진행하는데, 맥(Mac)에서 getOriginalFilename() 메서드를 사용하면, 한글의 자음과 모음을 분리합니다.

 

예를 들어, "그림.png"라는 파일을 업로드 후 getOriginalFilename() 메서드를 호출하면 윈도우(Windows)와 맥(Mac)에서 처리하는 방식이 다릅니다.

// 맥(Mac)에서 getOrginalFilename() 한글 처리 방식
["ㄱ", "ㅡ", "ㄹ", "ㅣ", "ㅁ", ".", "p", "n", "g"]

// 윈도우(Window)에서 getOrginalFilename() 한글 처리 방식
["그", "림", ".", "p", "n", "g"]

DataBase에 Insert 된 파일명의 문자열이 육안으로 보았을 때는 "그림"이지만, 한글의 자음과 모음이 분리된 상태로 Insert 되었기에 Like 연산자가 동작하지 않습니다.

OS마다 유니코드를 처리하는 방식이 다른데, 맥(Mac)은 NFD 방식을 윈도우(Windows)는 NFC 방식을 사용합니다.

제목 설명 OS
NFD 정준 분해 Mac
NFC 정준 분해 후 다시 정준 결합 GNU/Linux, Windows

따라서, 맥(Mac)에서 getOriginalFilename() 메서드로 파일명을 가져온 다음 NFC 방식으로 변환하는 과정이 필요합니다.


해결 방법

정규화 기능을 제공하는 Normalizer 클래스의 normalize() 메서드를 호출하여 NFC 형태로 정규화합니다.

String originFilename = 
  Normalizer.normalize(multipartFile.getOriginalFilename(), Normalizer.Form.NFC);
반응형

댓글