티스토리 뷰

웹으로부터 원하는 형식의 파일만 받고 싶을 때, 당연히 서버에선 필터링을 해야 한다.

사실 프론트에서도 (아무리 양심이 없어도) 최소한 다음과 같이 Accept 형식 제한은 걸어놓을것이다.
아래와 같이 accept를 설정하면 첨부파일 선택화면에서 사진과 영상 파일만 보인다.

<input accept="image/*,video/*" class="d-none" id="file" name="file" type="file">

사실 이건 우측하단을 "모든 파일"로 선택하면 다른 형식의 파일도 보여 선택 가능하게 된다.

따라서 선택된 다른 형식의 파일을 서버로 submit하기 전에 한번더 원하는 형식의 파일인지 확인하는 JS 방법이 분명히 있을 것이고, 또는 애초에 input 태그대신 좀더 기능이 추가된 라이브러리도 있지않을까싶다.

프론트에서 1차적으로 확인하는 것이 물론 좋고 다들 그렇게 하고 있겠지만,

이번엔 서버에서 FilenameUtils (Apache Commons IO 2.5 API)를 이용해서 파일 확장자를 검사하는 방법을 사용해보았다.

dependency 추가

implementation 'commons-io:commons-io:2.5'

간단히 메소드 방식을 확인할 수 있다.

  1. 기본적으로 파일명이 들어오면, 확장자를 리턴
  2. 확장자가 없으면, empty string 리턴
  3. 확장자만 있으면, 점(.)을 뺀 확장자를 리턴
  4. 빈 문자열 or NULL이 들어오면, 들어온 값을 그대로 리턴

사실 FilenameUtils(Apache Commons IO 2.5 API)외에도 자바에서 파일의 확장자를 구하는 방법은 더 있다고 한다.

  1. 노가다
  2. FilenameUtils (Apache Commons IO)
  3. Guava의 getFileExtension()

일단 간단히 구현하긴 했는데, 이후는 알아서.

private static final List<String> EXTENSIONS_IMAGE = Arrays.asList("bmp", "gif", "jpg", "png", "jpeg");
private static final List<String> EXTENSIONS_VIDEO = Arrays.asList("mp4", "avi", "mov", "mpg", "wmv", "mpeg");

private void validateFileExtension(String fileName) {
        fileName = FilenameUtils.getExtension(fileName.toLowerCase());
        if (EXTENSIONS_IMAGE.contains(fileName) || EXTENSIONS_VIDEO.contains(fileName)) {
            return;
        }
        throw new FileUploadException("유효하지않은 파일 형식입니다.");
    }
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함