← Alla verktyg

MIME-typer förklarade

Vad MIME-typer är, hur formatet typ/subtyp fungerar, var Content-Type spelar roll i HTTP och e-post, vanliga typer och varför fel typ ställer till problem.
FiländelseMIME-typ

Vad en MIME-typ egentligen är

En MIME-typ, även kallad mediatyp, är en kort etikett som talar om för mjukvara vilken sorts data en fil eller ett meddelandeinnehåll innehåller. Den föddes inom e-post (namnet står för Multipurpose Internet Mail Extensions) men dyker idag upp överallt på webben. Formatet är alltid typ/undertyp: en bred kategori, ett snedstreck och ett specifikt format. Så text/html betyder "text, i HTML-form", image/png betyder "en bild, i PNG-form", och application/json betyder "applikationsdata, kodad som JSON".

Toppnivåtypen kommer från en fast uppsättning som underhålls av IANA, det officiella registret: text, image, audio, video, application, font, model, multipart, och några nyare som haptics. Undertypen är det specifika formatet. Leverantörer kan lägga till sina egna med ett vnd.-prefix (till exempel application/vnd.ms-excel), och experimentella typer använde historiskt ett x--prefix, även om den konventionen numera avråds.

Abstrakta glödande filformatsikoner sorterade i märkta kategorirutor mot en mörk indigobakgrund
Varje filformat motsvarar en typ/undertyp-etikett.

Var MIME-typer spelar roll

Den enskilt viktigaste platsen en MIME-typ förekommer på är HTTP-svarshuvudet Content-Type. När en server skickar en sida, en bild eller en API-payload talar det här huvudet om för webbläsaren hur den ska tolka byten. Om huvudet säger text/html renderar webbläsaren markup; om det säger application/json kan ett fetch()-anrop tolka det; om det säger application/pdf öppnas den inbyggda visaren. Samma huvud skickas även på förfrågningssidan: när du POST:ar ett formulär eller en API-body talar Content-Type om för servern hur den ska läsa det du skickat.

Utöver HTTP driver MIME-typer flera andra system. E-postklienter använder dem för att avgöra om en bilaga är en bild att förhandsvisa eller en binärfil att spara. Filuppladdningshanterare inspekterar den deklarerade typen för att godkänna eller avvisa filer. Och operativsystemet eller webbläsaren använder typen, inte bara filändelsen, för att välja ett standardprogram. Samma idé ligger till grund för hur servrar rapporterar resultat och fel tillsammans med HTTP-statuskoder — ett 200-svar med fel typ kan vara lika trasigt som ett 404-svar.

De du kommer använda varje dag

En handfull typer täcker den absoluta merparten av den verkliga trafiken:

  • text/html — webbsidor (ändelse .html)
  • text/css — stilmallar (.css)
  • text/javascript — den rekommenderade typen för JavaScript (.js, .mjs)
  • application/json — den enda officiella JSON-typen, definierad i RFC 8259 (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — vanliga bildformat
  • application/pdf — PDF-dokument (.pdf)
  • application/octet-stream — samlingstypen för okänd eller godtycklig binärdata
  • text/plain — standarden för vanlig text utan en rikare typ

JSON förtjänar en notering eftersom det brukar ställa till det. Den enda korrekta typen är application/json. Äldre kod använde ibland text/json, text/plain eller application/x-javascript, men de är föråldrade och vissa klienter vägrar att tolka dem. Det finns heller ingen charset-parameter för JSON — specifikationen kräver UTF-8, så att skriva application/json; charset=utf-8 är överflödigt men ofarligt. För en mer komplett tabell över format och filändelser, se våra referenstabeller.

Ett glödande datapaket märkt med en abstrakt typbricka som flödar över en nätverksanslutning
Content-Type följer med payloaden över HTTP.

Varför en felaktig Content-Type förstör saker

Webbläsare och klienter litar på den deklarerade typen, så att få den fel har konkreta konsekvenser. Skicka ett JSON-API-svar som text/html och webbläsaren kan försöka rendera det, eller så kastar en strikt klient ett tolkningsfel innan din kod ens hinner köras. Skicka en CSS- eller JavaScript-fil med fel typ och en säkerhetsfunktion som kallas X-Content-Type-Options: nosniff gör att webbläsaren vägrar tillämpa den, vilket tyst förstör din sidas styling eller skript.

Nedladdningar är det andra klassiska felet. Om du vill att en fil ska laddas ner istället för att visas spelar typen roll tillsammans med huvudet Content-Disposition. En PDF som skickas som application/octet-stream laddas ner som en generisk fil istället för att öppnas i visaren; en bild som skickas som text/plain visas som obegripliga tecken. På uppladdningssidan kan en felmärkt fil glida förbi en naiv ändelsekontroll, vilket är anledningen till att robusta validerare inspekterar de faktiska byten (det "magiska numret") istället för att lita på den klientangivna typen.

Historiskt försökte webbläsare gissa, eller "sniffa", den verkliga typen när huvudet såg fel ut. Det beteendet orsakade säkerhetshål, så modern bästa praxis är att alltid skicka en korrekt Content-Type och inaktivera sniffning med nosniff. Kort sagt: sätt typen medvetet på varje svar, så försvinner de flesta rendering-, nedladdnings- och tolkningsbuggar.

Vanliga frågor

Vad är skillnaden mellan en MIME-typ och en mediatyp?

De är samma sak. "MIME-typ" är det äldre namnet från e-post, medan "mediatyp" är den term som IANA och moderna HTTP-specifikationer föredrar. Båda syftar på etiketten typ/undertyp.

Vad är den korrekta MIME-typen för JSON?

Det är application/json, definierad i RFC 8259. Äldre alternativ som text/json eller application/x-javascript är föråldrade och vissa klienter avvisar dem.

Vad betyder application/octet-stream?

Det är den generiska typen för godtycklig binärdata utan en mer specifik etikett. Servrar använder den som reservlösning för okända filtyper, vilket vanligtvis utlöser en nedladdning istället för visning i webbläsaren.

Varför laddas inte min CSS- eller JavaScript-fil?

Ofta skickar servern den med fel Content-Type. Med X-Content-Type-Options satt till nosniff vägrar webbläsaren tillämpa CSS som inte är text/css eller skript som inte är en JavaScript-typ. Åtgärda serverkonfigurationen så att rätt typ skickas.

Kan jag lägga till en charset i en MIME-typ?

Ja, för textformat, med en parameter som text/html; charset=utf-8. För JSON är det onödigt eftersom formatet alltid är UTF-8 enligt specifikationen, även om det inte skadar att lägga till den.

Avgör filändelsen MIME-typen?

Inte över HTTP. Servern bestämmer vilken Content-Type som ska skickas, och webbläsaren litar på det huvudet. Ändelsen fungerar bara som en fingervisning för verktyg och operativsystem när ingen explicit typ anges.