[swift] Swift에서 파일의 MIME 타입 설정하는 방법

파일의 MIME(Multipurpose Internet Mail Extensions) 타입은 파일의 종류나 형식을 식별하기 위해 사용됩니다. Swift에서는 파일의 MIME 타입을 설정하는 여러 가지 방법이 있습니다. 이 포스트에서는 몇 가지 예를 통해 그 방법들을 알아보겠습니다.

1. 파일 확장자에 기반한 MIME 타입 설정

파일의 확장자를 통해 MIME 타입을 설정할 수 있습니다. Swift에서는 URL의 경로 확장자를 통해 파일 확장자를 추출하는 기능을 제공합니다. 추출된 확장자를 통해 MIME 타입을 설정하는 방법은 다음과 같습니다.

import Foundation

func mimeType(for fileExtension: String) -> String? {
    if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension as CFString, nil)?.takeRetainedValue() {
        if let mimeType = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
            return mimeType as String
        }
    }
    return nil
}

let fileExtension = "jpg"
if let mimeType = mimeType(for: fileExtension) {
    print("MIME type for \(fileExtension): \(mimeType)")
} else {
    print("Unable to find MIME type for \(fileExtension)")
}

여기서 mimeType(for:) 함수는 주어진 확장자에 대해 MIME 타입을 찾아 반환합니다.

2. 파일 데이터 기반의 MIME 타입 설정

만약 파일의 확장자가 없는 경우에도 MIME 타입을 설정해야 한다면 파일 데이터를 기반으로 MIME 타입을 결정할 수 있습니다. 이 때는 파일의 마법(Magic) 숫자를 이용하여 MIME 타입을 파악합니다.

import Foundation

func mimeType(for fileData: Data) -> String? {
    var c = [UInt8](repeating: 0, count: 1)
    fileData.copyBytes(to: &c, count: 1)
    
    switch c {
    case [0xFF]: return "image/jpeg"
    case [0x89]: return "image/png"
    case [0x47]: return "image/gif"
    case [0x49], [0x4D]: return "image/tiff"
    default: return nil
    }
}

let fileData = Data(bytes: [0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01])
if let mimeType = mimeType(for: fileData) {
    print("MIME type for file data: \(mimeType)")
} else {
    print("Unable to determine MIME type from file data")
}

여기서 mimeType(for:) 함수는 주어진 파일 데이터에 대해 MIME 타입을 찾아 반환합니다.

3. MimeType.swift 라이브러리 사용

위의 방법 이외에도 MimeType.swift라이브러리를 사용하여 손쉽게 MIME 타입을 설정할 수 있습니다. 해당 라이브러리는 GitHub에서 확인할 수 있습니다. 라이브러리를 프로젝트에 추가한 후 다음과 같이 사용할 수 있습니다.

import Foundation
import MimeType

let fileExtension = "txt"
if let mimeType = MimeType.type(forExtension: fileExtension) {
    print("MIME type for \(fileExtension): \(mimeType.rawValue)")
} else {
    print("Unable to find MIME type for \(fileExtension)")
}

위의 코드는 주어진 확장자에 대해 MIME 타입을 찾아 출력합니다.

참고 자료