MIME 타입이란?MIME을 사용하는 이유?타입을 어떻게 알려줄까?MIME-Type 구조Apach Tika 사용법의존성 추가사용법1. 파일들을 먼저 업로드해서 타입 확인해보기2. 파일의 확장자를 변경해서 타입 확인해보기REF.
MIME 타입이란?
- 전자우편을 위한 인터넷 표준으로 바이너리 데이터를 ASCII 텍스트 형식으로 변환(인코딩)하기 위한 방법을 정의합니다.
MIME을 사용하는 이유?
- 옛날 전자우편은 ASCII파일 전송만 가능했었다. 하지만 바이너리 파일(음악, 동영상, 문서 등) 전송이 필요해졌으며 이를 전자우편으로 전송하기 위해 개발되었다.
- MIME표준에 정의된 Content-Type은 HTTP 통신에서 전송 데이터를 표현할때도 사용된다.
타입을 어떻게 알려줄까?
- MIME으로 인코딩 한 파일은 데이터의 종류를 알려주는 Content-Type 정보를 파일 앞부분에 담습니다.
- 브라우저의 경우 응답/요청 시 HTTP 메시지 헤더에 정보를 담아서 보내게 되는데 이 헤더에 Content-Type정보를 담아서 어떤 데이터 종류인지 알려줍니다.
MIME-Type 구조
- type/subtype으로 구성되어 있습니다. (전통적으로 소문자를 사용합니다.)
- type은 1.개별 혹은 2.멀티파트 타입이 될 수 있습니다.
[개별타입]
- text : 텍스트를 포함한 모든 문서 (인간 readable)
- image : 모든 종류의 이미지를 포함 (gif 포함)
- audio : 모든 종류의 오디오 파일
- video : 모든 종류의 비디오 파일
- application : 모든 종류의 바이너리 데이터
기본 타입에 있어 중요 역할을 하는 주요 MIME-Type
- text/plain
- 서브타입이 없는 텍스트 파일을 위한 기본값입니다.
- 서브타입이 있는 파일은 서브타입 명시되어야 올바르게 감지합니다.
- application/octet-stream
- 서브타입이 없는 바이너리 데이터/문서의 기본값
- 알려지지 않은 파일 타입은 이 타입을 사용해야 합니다.
- 웹브라우저가 실행여부를 묻기도 하는데 content-Disposition 헤더가 값 attachment와 함께 설?정되었고 “Save as” 파일을 제안하는지 여부에 따로 브라우저가 그것을 다루게 됩니다.
[멀티파트 타입]
합성된 문서를 나타내는 방법입니다.
- multipart/form-data (보통 서버로 데이터 보낼때 사용)
- 브라우저 → 서버로 HTML Form 내용을 전송 시 사용이 가능합니다.
- 경계(이중대시 - -로 시작되는 문자열)로 구분되는 다른 파트들로 구성됩니다.
- 각 파트는 자체로 개체이며 자신만의 HTTP 헤더를 가집니다.
- ex) 파일업로드 필드를 위한 헤더인 content-Diposition, 가장 일반적인 Content-Type

- multipart/byteranges
- 브라우저로 회신하는 부분적인 응답 전송의 context 내에서 사용됩니다.
- 206 Partial Content 상태 코드가 전송된 경우, MIME 타입은 문서가 각각의 요청된 범위 중 하나인 몇 가지 파트로 구성되어 있음을 알리기 위해 사용됩니다.
- boundary 디렉티브를 통해 경계선 문자열을 정의합니다.
- 각각 다른 파트들은 문서 타입을 나타내는 Content-Type 헤더와 범위를 나타내는 Content-Range를 가집니다.

- MIME Type 전체목록
- application
- audio
- font
- example
- image
- message
- model
- multipart
- text
- video
Apach Tika 사용법
의존성 추가
implementation 'org.apache.tika:tika-core:1.4' implementation 'org.apache.tika:tika-parsers:2.3.0'
사용법
- 간단하게 넘어온 파일의 실제 MIME 타입을 확인해 보겠습니다.
@PostMapping public void test(MultipartFile[] multipartFiles) throws IOException { Tika tika = new Tika(); for (MultipartFile file : multipartFiles) { String mimeType = tika.detect(file.getBytes()); System.out.println("**************************"); System.out.println(file.getOriginalFilename()); System.out.println("mimeType = " + mimeType); System.out.println("**************************"); } }
1. 파일들을 먼저 업로드해서 타입 확인해보기
- 현재 제 폴더에는 2개의 jpeg와 하나의 pdf파일이 존재하며 세개의 파일을 모두 컨트롤러로 요청을 보내보겠습니다.


- 아래의 결과를 보면 제대로된 타입이 나오는걸 확인하실 수 있습니다.

2. 파일의 확장자를 변경해서 타입 확인해보기
인스타뀨램 프로젝트를 진행했을 때 확장자를 잘 체크하도록 동작은 했지만 실제 확장자와 맞지 않는 타입을 강제로 확장자 타입에 맞게 변경한 후에 요청된 파일들에 대해서는 제대로 검증하지 못한 문제점이 존재했었습니다.
- 신청서의 pdf파일을 png로 변환시킨 후 컨트롤러로 요청을 보내보겠습니다.


- 아래의 결과를 보면 파일의 이름에는 png로 변경되어 있지만 실제 mimeType은 그대로 application/pdf로 출력되는 모습을 확인하실 수 있습니다.
