Mi is valójában egy MIME-típus
A MIME-típus, más néven médiatípus, egy rövid címke, amely megmondja a szoftvernek, milyen fajta adatot tartalmaz egy fájl vagy egy üzenettörzs. Az e-mailben született (a rövidítés a Multipurpose Internet Mail Extensions kifejezésből ered), de mára szinte mindenütt megjelenik a weben. A formátum mindig típus/altípus: egy tág kategória, egy perjel, majd egy konkrét formátum. Így a text/html azt jelenti, hogy "szöveg, HTML formában", az image/png azt, hogy "kép, PNG formában", az application/json pedig azt, hogy "alkalmazásadat, JSON kódolással".
A legfelső szintű típus egy rögzített, az IANA, a hivatalos nyilvántartó szervezet által karbantartott halmazból származik: text, image, audio, video, application, font, model, multipart, és néhány újabb, mint a haptics. Az altípus a konkrét formátum. A gyártók a saját altípusaikat vnd. előtaggal adhatják hozzá (például application/vnd.ms-excel), a kísérleti típusok pedig hagyományosan x- előtagot kaptak, bár ezt a szokást ma már nem ajánlott követni.

Hol számít igazán a MIME-típus
A legfontosabb hely, ahol egy MIME-típus megjelenik, a HTTP Content-Type válaszfejléc. Amikor a szerver egy oldalt, egy képet vagy egy API-választ küld, ez a fejléc mondja meg a böngészőnek, hogyan értelmezze a bájtokat. Ha a fejléc text/html-t ír, a böngésző jelölőnyelvet renderel; ha application/json-t, egy fetch() hívás fel tudja dolgozni; ha application/pdf-et, megnyílik a beépített megjelenítő. Ugyanez a fejléc a kérés oldalán is jelen van: amikor egy űrlapot vagy API-törzset POST-olunk, a Content-Type mondja meg a szervernek, hogyan olvassa be a küldött adatot.
A HTTP-n túl a MIME-típusok más rendszereket is vezérelnek. Az e-mail-kliensek ezek alapján döntik el, hogy egy melléklet előnézetben megjeleníthető kép-e, vagy inkább mentendő bináris fájl. A feltöltéskezelők a deklarált típust vizsgálva fogadják el vagy utasítják el a fájlokat. Az operációs rendszer vagy a böngésző pedig nem csak a fájlkiterjesztés, hanem a típus alapján választja ki az alapértelmezett alkalmazást. Ugyanez az elv áll amögött is, ahogyan a szerverek az eredményeket és hibákat a HTTP állapotkódokkal együtt jelentik — egy rossz típussal érkező 200-as válasz épp annyira lehet hibás, mint egy 404-es.
Amelyekkel nap mint nap találkozunk
Néhány típus lefedi a valódi forgalom túlnyomó részét:
text/html— weboldalak (.htmlkiterjesztés)text/css— stíluslapok (.css)text/javascript— a JavaScripthez ajánlott típus (.js,.mjs)application/json— az egyetlen hivatalos JSON-típus, az RFC 8259-ben definiálva (.json)image/png,image/jpeg,image/webp,image/svg+xml— gyakori képformátumokapplication/pdf— PDF-dokumentumok (.pdf)application/octet-stream— gyűjtőkategória ismeretlen vagy tetszőleges bináris adathoztext/plain— az alapértelmezett típus egyszerű szöveghez, amelynek nincs gazdagabb formátuma
A JSON külön említést érdemel, mert sokakat megzavar. Az egyetlen helyes típus az application/json. Régebbi kódokban néha text/json, text/plain vagy application/x-javascript szerepelt, de ezek elavultak, és egyes kliensek elutasítják a feldolgozásukat. A JSON-hoz nincs is charset paraméter — a specifikáció mindig UTF-8-at ír elő, így az application/json; charset=utf-8 felesleges, bár ártalmatlan. A formátumok és kiterjesztések teljesebb táblázatáért nézze meg referencia-táblázatainkat.

Miért okoz problémát egy rossz Content-Type
A böngészők és kliensek megbíznak a deklarált típusban, ezért ha az hibás, annak konkrét következményei vannak. Ha egy JSON API-választ text/html-ként küldünk, a böngésző megpróbálhatja renderelni, vagy egy szigorú kliens még azelőtt feldolgozási hibát dob, hogy a kódunk lefutna. Ha egy CSS- vagy JavaScript-fájlt rossz típussal küldünk, egy biztonsági funkció, az X-Content-Type-Options: nosniff, megakadályozza, hogy a böngésző alkalmazza azt, csendben elrontva az oldal stílusát vagy szkriptjeit.
A letöltések a másik klasszikus hibaforrás. Ha azt szeretnénk, hogy egy fájl letöltődjön ahelyett, hogy megjelenne, a típus a Content-Disposition fejléccel együtt számít. Egy application/octet-stream-ként küldött PDF általános fájlként töltődik le, ahelyett hogy megnyílna a megjelenítőben; egy text/plain-ként küldött kép értelmezhetetlen karaktersorozatként jelenik meg. A feltöltés oldalán egy hibásan címkézett fájl könnyen átcsúszhat egy naiv kiterjesztés-ellenőrzésen, ezért a megbízható validátorok a valódi bájtokat (az úgynevezett "mágikus számot") vizsgálják, nem a kliens által megadott típust.
Régebben a böngészők megpróbálták kitalálni, "megszimatolni" a valódi típust, ha a fejléc hibásnak tűnt. Ez a viselkedés biztonsági réseket okozott, ezért a modern legjobb gyakorlat az, hogy mindig pontos Content-Type-ot küldünk, és a szimatolást a nosniff beállítással letiltjuk. Röviden: állítsuk be tudatosan a típust minden válasznál, és a legtöbb megjelenítési, letöltési és feldolgozási hiba magától eltűnik.
Gyakran ismételt kérdések
Mi a különbség a MIME-típus és a médiatípus között?
Ugyanaz a kettő. A "MIME-típus" a régebbi, e-mailből származó elnevezés, míg a "médiatípus" az a kifejezés, amelyet az IANA és a modern HTTP-specifikációk előnyben részesítenek. Mindkettő a típus/altípus címkére utal.
Mi a helyes MIME-típus a JSON-hoz?
Az application/json, amelyet az RFC 8259 definiál. A régebbi alternatívák, mint a text/json vagy az application/x-javascript, elavultak, és egyes kliensek elutasítják őket.
Mit jelent az application/octet-stream?
Ez az általános típus tetszőleges bináris adathoz, amelyhez nincs pontosabb címke. A szerverek tartalék típusként használják ismeretlen fájlformátumokhoz, ami általában letöltést vált ki a böngészőben történő megjelenítés helyett.
Miért nem töltődik be a CSS- vagy JavaScript-fájlom?
Gyakran a szerver rossz Content-Type-tal küldi. Ha az X-Content-Type-Options nosniff-re van állítva, a böngésző nem alkalmazza azt a CSS-t, amely nem text/css, és azt a szkriptet, amely nem JavaScript-típusú. Javítsa a szerver beállítását, hogy a megfelelő típus menjen ki.
Adhatok charsetet egy MIME-típushoz?
Igen, szöveges formátumoknál, olyan paraméterrel, mint a text/html; charset=utf-8. JSON-nál felesleges, mert a formátum a specifikáció szerint mindig UTF-8, bár a hozzáadása nem árt.
A fájlkiterjesztés határozza meg a MIME-típust?
HTTP-n keresztül nem. A szerver dönti el, milyen Content-Type-ot küld, és a böngésző megbízik ebben a fejlécben. A kiterjesztés csak akkor szolgál útmutatóként az eszközök és operációs rendszerek számára, ha nincs megadva kifejezett típus.
