Mikä MIME-tyyppi todella on
MIME-tyyppi, jota kutsutaan myös mediatyypiksi, on lyhyt merkintä, joka kertoo ohjelmistolle, minkälaista dataa tiedosto tai viestin sisältö sisältää. Se syntyi sähköpostissa (nimi tulee sanoista Multipurpose Internet Mail Extensions), mutta nykyään sitä näkee kaikkialla verkossa. Muoto on aina tyyppi/alityyppi: laaja kategoria, kauttaviiva ja tarkempi muoto. Niinpä text/html tarkoittaa "tekstiä, HTML-muodossa", image/png tarkoittaa "kuvaa, PNG-muodossa" ja application/json tarkoittaa "sovellusdataa, JSON-koodattuna".
Ylätason tyyppi tulee IANA:n ylläpitämästä kiinteästä joukosta, joka on virallinen rekisteri: text, image, audio, video, application, font, model, multipart ja muutama uudempi, kuten haptics. Alityyppi on tarkka muoto. Valmistajat voivat lisätä omansa vnd.-etuliitteellä (esimerkiksi application/vnd.ms-excel), ja kokeelliset tyypit käyttivät historiallisesti x--etuliitettä, vaikka tätä käytäntöä ei enää suositella.

Missä MIME-tyypeillä on merkitystä
Tärkein paikka, jossa MIME-tyyppi näkyy, on HTTP:n Content-Type-vastausotsake. Kun palvelin lähettää sivun, kuvan tai API-vastauksen, tämä otsake kertoo selaimelle, miten tavuja tulkitaan. Jos otsake sanoo text/html, selain renderöi merkkauksen; jos se sanoo application/json, fetch()-kutsu voi jäsentää sen; jos se sanoo application/pdf, sisäänrakennettu katseluohjelma avautuu. Sama otsake kulkee myös pyyntöpuolella: kun lähetät lomakkeen tai API-pyynnön POST-metodilla, Content-Type kertoo palvelimelle, miten lähettämäsi data tulkitaan.
HTTP:n lisäksi MIME-tyypit ohjaavat useita muitakin järjestelmiä. Sähköpostiohjelmat käyttävät niitä päättääkseen, onko liite esikatseltava kuva vai tallennettava binääritiedosto. Tiedostonlatauksen käsittelijät tarkastavat ilmoitetun tyypin hyväksyäkseen tai hylätäkseen tiedostoja. Ja käyttöjärjestelmä tai selain käyttää tyyppiä, ei pelkkää tiedostopäätettä, valitakseen oletussovelluksen. Sama periaate on pohjana sille, miten palvelimet raportoivat tuloksia ja virheitä yhdessä HTTP-tilakoodien kanssa — 200-vastaus väärällä tyypillä voi olla yhtä rikki kuin 404.
Ne, joita käytät joka päivä
Kourallinen tyyppejä kattaa valtaosan todellisesta liikenteestä:
text/html— verkkosivut (pääte.html)text/css— tyylitiedostot (.css)text/javascript— suositeltu tyyppi JavaScriptille (.js,.mjs)application/json— ainoa virallinen JSON-tyyppi, määritelty RFC 8259:ssä (.json)image/png,image/jpeg,image/webp,image/svg+xml— yleiset kuvamuodotapplication/pdf— PDF-dokumentit (.pdf)application/octet-stream— kaikenkattava tyyppi tuntemattomalle tai mielivaltaiselle binääridatalletext/plain— oletus tavalliselle tekstille, jolla ei ole tarkempaa tyyppiä
JSON ansaitsee huomion, koska se kompastuttaa monia. Ainoa oikea tyyppi on application/json. Vanhempi koodi käytti joskus tyyppejä text/json, text/plain tai application/x-javascript, mutta ne ovat vanhentuneita ja jotkin asiakasohjelmat kieltäytyvät jäsentämästä niitä. JSON:lla ei myöskään ole charset-parametria – spesifikaatio määrää UTF-8:n, joten application/json; charset=utf-8 -kirjoitusasu on tarpeeton, joskin harmiton. Kattavamman taulukon muodoista ja tiedostopäätteistä löydät viitetaulukoistamme.

Miksi väärä Content-Type rikkoo asioita
Selaimet ja asiakasohjelmat luottavat ilmoitettuun tyyppiin, joten sen väärin ilmoittamisella on konkreettisia seurauksia. Jos lähetät JSON-API-vastauksen tyyppinä text/html, selain saattaa yrittää renderöidä sen, tai tiukka asiakasohjelma voi heittää jäsennysvirheen ennen kuin koodisi ehtii edes suorittua. Jos lähetät CSS- tai JavaScript-tiedoston väärällä tyypillä, turvallisuusominaisuus nimeltä X-Content-Type-Options: nosniff saa selaimen kieltäytymään soveltamasta sitä, mikä rikkoo sivusi tyylit tai skriptit huomaamatta.
Lataukset ovat toinen klassinen virhelähde. Jos haluat tiedoston latautuvan sen sijaan, että se näytetään, tyypillä on merkitystä yhdessä Content-Disposition-otsakkeen kanssa. PDF lähetettynä tyypillä application/octet-stream latautuu geneerisenä tiedostona sen sijaan, että se avautuisi katseluohjelmassa; kuva lähetettynä tyypillä text/plain näkyy merkkisekamelskana. Lähetyspuolella väärin merkitty tiedosto voi livahtaa naiivin tiedostopäätetarkistuksen ohi, minkä vuoksi vankat validaattorit tarkastavat todelliset tavut ("taikaluvun") sen sijaan, että luottaisivat asiakkaan ilmoittamaan tyyppiin.
Historiallisesti selaimet yrittivät arvata, eli "haistella", todellisen tyypin, kun otsake näytti väärältä. Tämä käytös aiheutti turvallisuusaukkoja, joten nykyaikainen paras käytäntö on lähettää aina tarkka Content-Type ja poistaa haistelu käytöstä nosniff-asetuksella. Lyhyesti: aseta tyyppi tarkoituksella jokaiseen vastaukseen, ja useimmat renderöinti-, lataus- ja jäsennysvirheet katoavat.
Usein kysytyt kysymykset
Mikä ero on MIME-tyypillä ja mediatyypillä?
Ne ovat sama asia. "MIME-tyyppi" on vanhempi nimi sähköpostimaailmasta, kun taas "mediatyyppi" on termi, jota IANA ja nykyaikaiset HTTP-spesifikaatiot suosivat. Molemmat viittaavat tyyppi/alityyppi-merkintään.
Mikä on JSON:n oikea MIME-tyyppi?
Se on application/json, määritelty RFC 8259:ssä. Vanhemmat vaihtoehdot kuten text/json tai application/x-javascript ovat vanhentuneita, ja jotkin asiakasohjelmat hylkäävät ne.
Mitä application/octet-stream tarkoittaa?
Se on yleinen tyyppi mielivaltaiselle binääridatalle, jolla ei ole tarkempaa merkintää. Palvelimet käyttävät sitä varasuunnitelmana tuntemattomille tiedostotyypeille, mikä yleensä käynnistää latauksen sen sijaan, että tiedosto näytettäisiin selaimessa.
Miksi CSS- tai JavaScript-tiedostoni ei lataudu?
Usein palvelin lähettää sen väärällä Content-Type-arvolla. Kun X-Content-Type-Options on asetettu arvoon nosniff, selain kieltäytyy soveltamasta CSS:ää, joka ei ole text/css, tai skriptejä, jotka eivät ole JavaScript-tyyppiä. Korjaa palvelinasetukset niin, että oikea tyyppi lähetetään.
Voinko lisätä charsetin MIME-tyyppiin?
Kyllä, tekstimuodoissa, käyttäen parametria kuten text/html; charset=utf-8. JSON:ssa se on tarpeeton, koska muoto on spesifikaation mukaan aina UTF-8, vaikka sen lisääminen ei haittaakaan.
Määrittääkö tiedostopääte MIME-tyypin?
Ei HTTP:n yli. Palvelin päättää, minkä Content-Type-arvon se lähettää, ja selain luottaa tähän otsakkeeseen. Tiedostopääte toimii vain vihjeenä työkaluille ja käyttöjärjestelmille, kun mitään tarkkaa tyyppiä ei ole annettu.
