MIME Type — این چیست، انواع فایل و تشخیص در iOS

نویسنده: IT Sectr منتشر شده: 2026-07-11 زمان مطالعه: 7 دقیقه

MIME Type — یک شناسه استاندارد شده فرمت داده است که در iOS برای تعیین نوع فایل هنگام انتقال از طریق شبکه، سیستم فایل و ارتباط بین فرآیندی استفاده می‌شود. به گفته Apple Developer Documentation, 2024، MIME Type (Multipurpose Internet Mail Extensions) فایل‌ها را بر اساس محتوایشان طبقه‌بندی می‌کند: image/jpeg, application/pdf, text/plain. iOS MIME را از طریق UTType به UTI (Uniform Type Identifier) تبدیل می‌کند برای پردازش سیستمی فایل‌ها.

نکات کلیدی

  • MIME Type — شناسه فرمت داده از دو بخش: نوع/زیرنوع (image/png)
  • UTType — معادل iOS برای MIME که در داخل سیستم برای شناسایی انواع فایل استفاده می‌شود
  • تبدیل بین MIME و UTI از طریق UTType.preferredMIMEType انجام می‌شود
  • تشخیص MIME با پسوند فایل، محتوا (magic bytes) یا هدر HTTP امکان‌پذیر است
  • iOS Sandbox دسترسی به فایل‌های انواع ناشناخته را محدود می‌کند — ثبت صحیح انواع سفارشی مهم است

MIME Type چیست؟

MIME Type (Multipurpose Internet Mail Extensions) — یک شناسه استاندارد شده فرمت داده است که از دو بخش تشکیل شده: نوع اصلی (type) و زیرنوع (subtype)، که با یک خط مورب از هم جدا شده‌اند. دسته‌بندی‌های اصلی: text (متن)، image (تصاویر)، audio (صدا)، video (ویدئو)، application (داده‌های باینری)، multipart (پیام‌های ترکیبی).

استاندارد MIME در ابتدا برای پیوست‌های ایمیل توسعه یافت (RFC 2046, 1996)، اما امروزه در همه جا استفاده می‌شود: سرورهای HTTP Content-Type پاسخ را مشخص می‌کنند، مرورگرها نحوه پردازش فایل‌ها را تعیین می‌کنند و برنامه‌های موبایل — چه داده‌هایی قابل باز شدن هستند. IANA (Internet Assigned Numbers Authority) فهرست انواع MIME ثبت شده را نگهداری می‌کند.

به گفته IANA Media Types Registry (2024)، بیش از 1800 نوع MIME رسمی ثبت شده است و تعداد واقعی با در نظر گرفتن انواع سفارشی و فروشنده‌ای از 5000 فراتر می‌رود. iOS بیشتر انواع استاندارد را پشتیبانی می‌کند و API برای کار با آنها از طریق Uniform Type Identifiers ارائه می‌دهد.

MIME و UTI در iOS: تفاوت‌ها و تبدیل

UTI (Uniform Type Identifier) — سیستم اختصاصی Apple برای شناسایی انواع محتوا است که در داخل iOS و macOS استفاده می‌شود. برخلاف MIME، UTI از سلسله‌مراتب وراثت پشتیبانی می‌کند (مثلاً public.image — والد برای public.png و public.jpeg) و نه تنها فرمت‌های فایل، بلکه انواع داده انتزاعی را نیز شامل می‌شود.

MIME TypeUTIپسوندتوضیحات
image/jpegpublic.jpeg.jpg, .jpegتصویر JPEG
application/pdfcom.adobe.pdf.pdfسند PDF
text/plainpublic.plain-text.txtفایل متنی
application/jsonpublic.json.jsonداده JSON
video/mp4public.mpeg-4.mp4ویدئو MP4

تبدیل بین MIME و UTI در iOS از طریق کلاس UTType (iOS 14+) انجام می‌شود. سیستم یک پایگاه داده داخلی از مطابقت‌ها را نگهداری می‌کند که بیشتر فرمت‌های استاندارد را پوشش می‌دهد. برای انواع سفارشی، توسعه‌دهنده مطابقت را در Info.plist ثبت می‌کند.

swift
import UniformTypeIdentifiers

let mimeType = "image/jpeg"
if let uti = UTType(mimeType: mimeType) {
    print("UTI: \(uti.identifier)")
    print("Conforms to image: \(uti.conforms(to: .image))")
    print("Extension: \(uti.preferredFilenameExtension ?? "")")
}

// تبدیل معکوس: UTI به MIME
if let uti = UTType(filenameExtension: "pdf"),
   let mime = uti.preferredMIMEType {
    print("MIME for PDF: \(mime)")
}

سلسله‌مراتب UTI امکان بررسی اینکه آیا یک نوع با دسته خاصی مطابقت دارد را فراهم می‌کند. مثلاً همه انواع تصاویر (JPEG, PNG, GIF) conforms(to: .image). این برای فیلتر گروهی و تعیین قابلیت پردازش نوع توسط اجزای سیستم مفید است.

تفاوت مهم: MIME — یک طبقه‌بندی مسطح است (بدون وراثت)، در حالی که UTI از وراثت چندگانه پشتیبانی می‌کند. مثلاً public.html هم با public.source-code و هم با public.text مطابقت دارد. این امر مسیریابی انعطاف‌پذیرتری را هنگام پردازش فایل‌ها در iOS فراهم می‌کند.

نحوه تشخیص MIME Type فایل در iOS

سه روش برای تشخیص MIME Type در iOS موجود است: با پسوند فایل (سریع اما غیرقابل اعتماد)، با محتوا از طریق magic bytes (قابل اعتماد اما نیاز به خواندن فایل دارد) و با هدر HTTP Content-Type (فقط برای درخواست‌های شبکه).

swift
import UniformTypeIdentifiers

enum MIMEDetector {
    // تشخیص با پسوند
    static func fromExtension(_ ext: String) -> String? {
        UTType(filenameExtension: ext)?.preferredMIMEType
    }

    // تشخیص با محتوا (magic bytes)
    static func fromFile(at url: URL) -> String? {
        guard let handle = try? FileHandle(forReadingFrom: url) else {
            return nil
        }
        defer { handle.closeFile() }
        let header = handle.readData(ofLength: 12)

        // PNG: 89 50 4E 47 0D 0A 1A 0A
        // JPEG: FF D8 FF
        // PDF: 25 50 44 46
        // ZIP: 50 4B 03 04

        if header.starts(with: [0x89, 0x50, 0x4E, 0x47]) {
            return "image/png"
        }
        if header.starts(with: [0xFF, 0xD8, 0xFF]) {
            return "image/jpeg"
        }
        if header.starts(with: [0x25, 0x50, 0x44, 0x46]) {
            return "application/pdf"
        }
        return nil
    }
}

تشخیص با پسوند از طریق UTType — سریع‌ترین روش است، اما اگر پسوند وجود نداشته باشد یا جعلی باشد غیرقابل اعتماد است. یک مهاجم می‌تواند .exe را به .jpg تغییر نام دهد — سیستم image/jpeg را تشخیص می‌دهد، در حالی که فایل اجرایی است. برای سناریوهای حیاتی (امنیت، داده‌های پزشکی) حتماً از بررسی محتوا استفاده کنید.

Magic bytes — اولین بایت‌های فایل هستند که برای هر فرمت منحصر به فرد می‌باشند. بیشتر فرمت‌ها امضایی متشکل از 2–12 بایت دارند. iOS یک تشخیص‌دهنده داخلی MIME بر اساس محتوا ارائه نمی‌دهد — توسعه‌دهنده یا جدول امضاها را خود پیاده‌سازی می‌کند یا از کتابخانه‌هایی مانند CocoaLumberjack یا یک تشخیص‌دهنده سفارشی مبتنی بر اکتشافات استفاده می‌کند.

ثبت انواع سفارشی MIME و UTI

انواع سفارشی زمانی ضروری هستند که برنامه با فرمت‌های داده اختصاصی کار می‌کند که در IANA یا Apple ثبت نشده‌اند. ثبت در Info.plist به iOS اجازه می‌دهد چنین فایل‌هایی را به درستی پردازش کند: آنها را از Files.app باز کند، آیکون‌ها نمایش دهد و از طریق UIActivityViewController به برنامه‌های دیگر ارسال کند.

xml
<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>MyApp Document</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.myapp.secret-doc</string>
        </array>
    </dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeIdentifier</key>
        <string>com.myapp.secret-doc</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array><string>sdoc</string></array>
            <key>public.mime-type</key>
            <array><string>application/vnd.myapp.secret-doc</string></array>
        </dict>
    </dict>
</array>

برای ثبت یک نوع سفارشی باید در Info.plist مشخص کنید: شناسه UTI (به فرمت reverse-DNS)، مطابقت با انواع والد، پسوند فایل و نوع MIME. iOS از این اطلاعات برای مسیریابی فایل‌ها استفاده می‌کند: وقتی کاربر یک فایل .sdoc را باز می‌کند، سیستم می‌داند که مالک آن برنامه شماست.

UTExportedTypeDeclarations — برای انواع تعریف شده توسط برنامه شما (صادرات). UTImportedTypeDeclarations — برای انواع ایجاد شده توسط برنامه‌های دیگر که برنامه شما می‌تواند با آنها کار کند (واردات). Apple توصیه می‌کند همه انواع سفارشی که برنامه با آنها کار می‌کند را برای یکپارچه‌سازی صحیح با سیستم ثبت کنید.

امنیت و پردازش انواع ناشناخته

انواع MIME ناشناخته برای امنیت برنامه iOS خطر ایجاد می‌کنند. اگر فایل دارای نوع ناشناخته یا تأیید نشده باشد، برنامه باید اقدامات احتیاطی انجام دهد: فایل را به طور خودکار باز نکند، به کاربر هشدار نشان دهد یا قبل از پردازش محتوا را تحلیل کند.

تهدیدهای اصلی: یک فایل با نوع MIME جعلی ممکن است حاوی کد مخرب یا بهره‌برداری از آسیب‌پذیری تجزیه‌کننده باشد. iOS از سیستم از طریق Sandbox محافظت می‌کند، اما برنامه ممکن است آسیب‌پذیر باشد اگر بدون بررسی محتوا به نوع MIME اعتماد کند. همیشه فایل را از طریق magic bytes بررسی کنید اگر از منبع غیرقابل اعتماد دریافت شده است.

به گفته OWASP Mobile Security Guide, 2024، برای پردازش فایل‌های انواع ناشناخته از روش‌های زیر استفاده می‌شود: فایل‌های با نوع MIME application/octet-stream از منابع تأیید نشده را رد کنید؛ برای بررسی مطابقت با دسته‌های مورد انتظار از UTType استفاده کنید؛ فایل‌ها را در برنامه‌های خارجی بدون تأیید کاربر باز نکنید؛ تمام موارد عدم مطابقت بین MIME و محتوای واقعی را برای حسابرسی امنیتی ثبت کنید.

ثبت انواع MIME سفارشی در Info.plist — این نه تنها قابلیت، بلکه امنیت است. اگر برنامه فقط انواع خود را به درستی ثبت کند، سیستم به اشتباه فایل‌های دیگر را به آن ارسال نخواهد کرد. به جای پیشوندهای عمومی (application/x-format) از پیشوندهای خاص فروشنده (application/vnd.company.app-format) استفاده کنید تا از تداخل با برنامه‌های دیگر جلوگیری کنید.

سوالات متداول

MIME Type چیست؟

MIME Type — یک شناسه استاندارد فرمت داده است که از نوع و زیرنوع تشکیل شده (مثلاً image/jpeg). توسط سرورهای HTTP، مرورگرها و برنامه‌ها برای تعیین روش پردازش فایل استفاده می‌شود.

تفاوت UTI با MIME در iOS چیست؟

UTI (Uniform Type Identifier) — سیستم Apple برای شناسایی انواع محتوا با پشتیبانی از سلسله‌مراتب وراثت. MIME — یک استاندارد مسطح برای شبکه است. iOS از UTType برای تبدیل بین UTI و MIME از طریق ویژگی preferredMIMEType استفاده می‌کند.

نحوه تشخیص MIME Type فایل در iOS چگونه است؟

سه روش: با پسوند از طریق UTType(filenameExtension:)، با محتوا از طریق magic bytes (بایت‌های اول فایل)، با هدر HTTP Content-Type. برای امنیت از بررسی محتوا استفاده کنید، نه فقط پسوند.

چگونه یک نوع MIME سفارشی در iOS ثبت کنیم؟

UTExportedTypeDeclarations را در Info.plist اضافه کنید: شناسه UTI (com.company.format)، پسوند فایل، نوع MIME و نوع والد را مشخص کنید. فایل‌های با این پسوند به طور خودکار با برنامه شما مرتبط می‌شوند.

با انواع MIME ناشناخته چه باید کرد؟

اعتماد نکنید به MIME ناشناخته. محتوا را از طریق magic bytes بررسی کنید، به کاربر هشدار نشان دهید و فایل را به طور خودکار باز نکنید. برای فایل‌های نوع application/octet-stream همیشه قبل از پردازش تحلیل اکتشافی انجام دهید.

خلاصه

  • MIME Type — شناسه استاندارد شده فرمت داده (نوع/زیرنوع) که در HTTP و iOS استفاده می‌شود
  • UTType — API iOS برای کار با انواع محتوا با پشتیبانی از سلسله‌مراتب و تبدیل MIME←UTI
  • تشخیص نوع با پسوند، magic bytes یا هدر HTTP Content-Type انجام می‌شود
  • انواع سفارشی در Info.plist از طریق UTExportedTypeDeclarations ثبت می‌شوند
  • امنیت نیاز به بررسی محتوا دارد — MIME از هدر می‌تواند جعلی باشد
  • سلسله‌مراتب UTI امکان بررسی دسته فایل (تصویر، متن، ویدئو) را از طریق conforms(to:) فراهم می‌کند
  • Application/octet-stream — نوع جهانی برای داده‌های باینری ناشناخته، نیاز به تحلیل اکتشافی دارد

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید