Veelgebruikte MIME-types

Servers en uploadformulieren vertrouwen op deze strings; een verkeerd type kan previews, downloads of je CSP breken.

Bijgewerkt:

SoortMIME-typeTypische extensie
HTMLtext/html.html
CSStext/css.css
JavaScripttext/javascript.js
JSONapplication/json.json
XMLapplication/xml.xml
Platte teksttext/plain.txt
CSVtext/csv.csv
PDFapplication/pdf.pdf
ZIPapplication/zip.zip
PNGimage/png.png
JPEGimage/jpeg.jpg
GIFimage/gif.gif
WebPimage/webp.webp
SVGimage/svg+xml.svg
ICOimage/x-icon.ico
MP3audio/mpeg.mp3
WAVaudio/wav.wav
MP4video/mp4.mp4
WebMvideo/webm.webm
WOFF2font/woff2.woff2
URL-gecodeerd formulierapplication/x-www-form-urlencoded—
Multipart-formuliermultipart/form-data—

Opmerkingen

Wat het MIME-type precies regelt

Een MIME-type is het label dat een server aan een respons hecht om de browser mee te geven wat de bytes voorstellen. text/html render een pagina, application/pdf opent een reader, image/svg+xml kan inline worden getekend en application/octet-stream triggert een downloadprompt. Twee bestanden die er identiek uitzien, kunnen hierdoor compleet anders gedrag vertonen. Browsers, uploadformulieren, e-mailclients en content-securityregels lezen dit type, dus een foutieve waarde is een veelvoorkomende oorzaak van gebroken voorvertoningen, geforceerde downloads en geblokkeerde scripts.

Waar text/ en application/ vandaag de dag op van toepassing zijn

Ouder advies stelde dat JavaScript application/javascript was; de huidige norm is text/javascript en application/javascript is verouderd. CSS is text/css, HTML is text/html, platte tekst is text/plain en CSV is text/csv — allemaal text/* omdat ze bedoeld zijn om door mensen te lezen. Gestructureerde formaten vallen onder application/*: application/json, application/xml, application/pdf, application/zip. De opvallende uitzondering is SVG: het is XML, maar moet als image/svg+xml worden geserveerd, zodat browsers het tekenen in plaats van te downloaden.

Verkeerde types breken uploads en beveiliging

Een foute labeling bij een upload is een klassieke bron van bugs: een JSON-bestand dat als text/plain wordt geserveerd, kan door een API-client worden geweigerd; een afbeelding die als octet-stream terugkomt, downloadt in plaats van te worden weergegeven; en een script dat als text/html wordt geserveerd, wordt door de browser geblokkeerd. Strikte Content-Security-Policy-regels zijn gekoppeld aan het MIME-type, dus een stylesheet die met het verkeerde type wordt geserveerd, kan direct worden geweigerd. Als een preview of download onregelmatig gedrag vertoont, is het controleren van de Content-Type in de respons meestal de snelste manier om het probleem te diagnosticeren.

Charset en content sniffing

Koppel bij text-typen het MIME-type aan een charset — text/html; charset=utf-8 en application/json; charset=utf-8 zijn de veilige standaardwaarden voor alles met meertalige inhoud. Oudere browsers gebruikten content sniffing om een type te raden aan de hand van de bytes in het bestand, iets wat aanvallers misbruikten; het versturen van X-Content-Type-Options: nosniff zegt de browser dat het het opgegeven type moet vertrouwen in plaats van te raden. Verstuur altijd een expliciete, correcte Content-Type in plaats van te vertrouwen op de bestandsextensie, die de browser nooit ziet.

Types instellen op de server en in formulieren

Het maakt uit waar het type vandaan komt. Statische hosts mapsen extensies automatisch, maar webframeworks moeten het vaak expliciet instellen — in Express met res.type('json'), in Nginx via het types-blok en op Cloudflare Pages via headers of de bestandsextensie. HTML-formulieren gebruiken enctype om de uploadcodering te bepalen: multipart/form-data voor bestanden en application/x-www-form-urlencoded voor gewone velden, terwijl een API die JSON verwacht application/json verstuurt. Het versturen van het verkeerde type is een stille bron van 415 Unsupported Media Type- en 400-responses die mysterieus ogen tot je de request-header onderzoekt.

Andere Families die de moeite waard zijn om te kennen

Naast de alledaagse webformaten zijn een paar families de moeite waard om te herkennen. Lettertypen gebruiken font/woff2 en font/ttf. Afbeeldingen worden opgedeeld per formaat — image/jpeg, image/png, image/webp, image/avif, image/gif — terwijl audio en video gebruikmaken van audio/mpeg, audio/ogg, video/mp4 en video/webm. Archieven en binaire blobs zijn application/zip, application/gzip en application/octet-stream. Wanneer een API een bestand teruggeeft dat niet geïdentificeerd kan worden, is octet-stream het eerlijke antwoord: het dwingt de client om te downloaden in plaats van te raden, precies het gedrag dat je wilt wanneer de inhoud onbekend is.

Veelgestelde vragen

Welk MIME-type moet ik gebruiken voor een .json-bestand?
Gebruik application/json voor JSON-bestanden en API-antwoorden. Dat is het standaardtype, liefst met UTF-8 geleverd.
Welk MIME-type hebben .js-bestanden?
Het officiële type voor JavaScript is text/javascript. Het oudere application/javascript is verouderd en hoort niet meer gebruikt te worden.
Welk MIME-type heeft een SVG-afbeelding?
SVG-bestanden gebruiken image/svg+xml. Alleen met dat type renderen browsers SVG inline.

Bronnen