Un tipo di media (noto anche come Multipurpose Internet Mail Extensions o tipo MIME) indica la natura e il formato di un documento, file o assortimento di byte. I tipi MIME sono definiti e standardizzati nell’RFC 6838 dell’IETF.

L’Internet Assigned Numbers Authority (IANA) è responsabile di tutti i tipi MIME ufficiali e puoi trovare l’elenco più aggiornato e completo nella loro pagina Media Types.

Nota

Avviso: i browser utilizzano il tipo MIME, non l’estensione del file, per determinare come elaborare un URL, quindi è importante che i server Web inviino il tipo MIME corretto nell’intestazione Content-Type della risposta. Se non è configurato correttamente, è probabile che i browser interpretino male il contenuto dei file, i siti non funzioneranno correttamente e i file scaricati potrebbero essere gestiti in modo errato.

Struttura di un tipo MIME
Un tipo MIME è solitamente costituito da due sole parti: un tipo e un sottotipo, separati da una barra (/), senza spazi vuoti tra:

type/subtype

Il tipo rappresenta la categoria generale in cui rientra il tipo di dati, come video o testo.

Il sottotipo identifica il tipo esatto di dati del tipo specificato rappresentato dal tipo MIME. Ad esempio, per il tipo MIME text, il sottotipo potrebbe essere plain (testo semplice), html (codice sorgente HTML) o calendar (per iCalendar/.ics).

type/subtype;parameter=value

Ad esempio, per qualsiasi tipo MIME il cui tipo principale è testo, puoi aggiungere il parametro charset facoltativo per specificare il set di caratteri utilizzato per i caratteri nei dati. Se non viene specificato alcun charset, il valore predefinito è ASCII (US-ASCII) a meno che non venga sovrascritto dalle impostazioni dell’agente utente. Per specificare un file di testo UTF-8, è usato il tipo MIME  text/plain;charset=UTF-8 .

I tipi MIME non sono sensibili alle maiuscole e minuscole, ma sono tradizionalmente scritti in minuscolo. I valori dei parametri possono essere sensibili alle maiuscole e minuscole.

Type

Esistono due classi di type: discreti e multipart. I type discreti sono type che rappresentano un singolo file o supporto, come un singolo file di testo o musicale, o un singolo video. Un type multipart rappresenta un documento composto da più parti componenti, ciascuna delle quali può avere il proprio type MIME individuale; oppure, un type multipart può incapsulare più file inviati insieme in una transazione. Ad esempio, i type MIME multipart vengono utilizzati quando si allegano più file a un’e-mail.

Type discrete

I Type discrete attualmente registrati con IANA sono:

application
Qualsiasi tipo di dati binari che non rientra esplicitamente in uno degli altri tipi; dati che saranno eseguiti o interpretati in qualche modo o dati binari che richiedono un’applicazione specifica o una categoria di applicazione da utilizzare. I dati binari generici (o dati binari il cui tipo reale è sconosciuto) sono application/octet-stream. Altri esempi comuni includono application/pdf, application/pkcs8 e application/zip. (Vedi il registro dei tipi di applicazione su IANA)

audio
Dati audio o musicali. Esempi includono audio/mpeg, audio/vorbis. (Vedi il registro dei tipi audio su IANA)

example
Riservato per l’uso come segnaposto negli esempi che mostrano come utilizzare i tipi MIME. Questi non dovrebbero mai essere utilizzati al di fuori di elenchi di codice di esempio e documentazione. esempio può anche essere utilizzato come sottotipo; ad esempio, in un esempio correlato all’utilizzo di audio sul Web, il tipo MIME audio/esempio può essere utilizzato per indicare che il tipo è un segnaposto e dovrebbe essere sostituito con uno appropriato quando si utilizza il codice nel mondo reale.

font
Dati font/carattere tipografico. Esempi comuni includono font/woff, font/ttf e font/otf. (Vedi registro tipi font su IANA)

image
Dati immagine o grafici che includono sia immagini fisse bitmap che vettoriali, nonché versioni animate di formati di immagini fisse come GIF animate o APNG. Esempi comuni sono image/jpeg, image/png e image/svg+xml. (Vedi registro tipi immagine su IANA)

model
Dati modello per un oggetto o una scena 3D. Esempi includono model/3mf e model/vrml. (Vedi registro tipi modello su IANA)

text
Dati solo testo che includono qualsiasi contenuto leggibile dall’uomo, codice sorgente o dati testuali come dati formattati con valori separati da virgole (CSV). Esempi includono: text/plain, text/csv e text/html. (Vedi registro tipi testo su IANA)

video
Dati o file video, come filmati MP4 (video/mp4). (Vedi il registro dei tipi di video presso IANA)

Per i documenti di testo senza un sottotipo specifico, si dovrebbe usare text/plain. Analogamente, per i documenti binari senza un sottotipo specifico o noto, si dovrebbe usare application/octet-stream.

Multipart types

Multipart types indicano una categoria di documento suddiviso in parti, spesso con tipi MIME diversi; possono anche essere utilizzati, in particolare in scenari di posta elettronica, per rappresentare più file separati che fanno tutti parte della stessa transazione. Rappresentano un documento composito.

Ad eccezione di multipart/form-data, utilizzato nel metodo POST di HTML Forms, e multipart/byteranges, utilizzato con 206 Partial Content per inviare parte di un documento, HTTP non gestisce i documenti multipart in un modo speciale: il messaggio viene trasmesso al browser (che probabilmente mostrerà una finestra “Salva con nome” se non sa come visualizzare il documento).

Esistono due tipi multipart:

message
Un messaggio che incapsula altri messaggi. Può essere utilizzato, ad esempio, per rappresentare un’e-mail che include un messaggio inoltrato come parte dei suoi dati o per consentire l’invio di messaggi molto grandi in blocchi come se fossero più messaggi.

Esempi possono essere message/rfc822 (per la quotazione di messaggi inoltrati o a cui si è risposto) e message/partial per consentire la suddivisione automatica di un messaggio di grandi dimensioni in messaggi più piccoli da riassemblare da parte del destinatario. (Vedi registro dei tipi di messaggio su IANA)

multipart
Dati costituiti da più componenti che possono avere individualmente tipi MIME diversi. Esempi includono multipart/form-data (per i dati prodotti utilizzando l’API FormData) e multipart/byteranges (definito in RFC 7233, sezione 5.4.1 e utilizzato con la risposta HTTP 206 “Partial Content” restituita quando i dati recuperati sono solo una parte del contenuto, come quando vengono forniti utilizzando l’intestazione Range). (Vedi registro dei type multipart su IANA)

Tipi MIME importanti per gli sviluppatori Web

application/octet-stream
Questo è il valore predefinito per i file binari. Poiché significa file binario sconosciuto, i browser di solito non lo eseguono o addirittura non chiedono se deve essere eseguito. Lo trattano come se l’intestazione Content-Disposition fosse impostata su attachment e propongono una finestra di dialogo “Save As”.

text/plain
Questo è il valore predefinito per i file di testo. Anche se in realtà significa “file di testo sconosciuto”, i browser presumono di poterlo visualizzare.

Nota

Nota: text/plain non significa “qualsiasi tipo di dati testuali”. Se si aspettano un tipo specifico di dati testuali, probabilmente non lo considereranno una corrispondenza. In particolare, se scaricano un file text/plain da un elemento che dichiara un file CSS, non lo riconosceranno come un file CSS valido se presentato con text/plain. Deve essere utilizzato il tipo mime CSS text/css.

text/css

I file CSS utilizzati per definire lo stile di una pagina Web devono essere inviati con text/css. Se un server non riconosce il suffisso .css per i file CSS, può inviarli con i tipi MIME text/plain o application/octet-stream. In tal caso, non saranno riconosciuti come CSS dalla maggior parte dei browser e verranno ignorati.

text/html

Tutti i contenuti HTML dovrebbero essere serviti con questo tipo. I tipi MIME alternativi per XHTML (come application/xhtml+xml) sono per lo più inutili al giorno d’oggi.

Nota: usa application/xml o application/xhtml+xml se vuoi le rigide regole di analisi XML, le sezioni o gli elementi che non provengono da namespace HTML/SVG/MathML.

text/javascript

Secondo il registro dei tipi di media IANA, RFC 9239 e la specifica HTML, i contenuti JavaScript dovrebbero sempre essere serviti utilizzando il tipo MIME text/javascript. Nessun altro tipo MIME è considerato valido per JavaScript e l’utilizzo di qualsiasi tipo MIME diverso da text/javascript potrebbe causare script che non vengono caricati o eseguiti.

Potresti trovare alcuni contenuti JavaScript forniti in modo errato con un parametro charset come parte del tipo MIME, come tentativo di specificare il set di caratteri per il contenuto dello script. Quel parametro charset non è valido per i contenuti JavaScript e nella maggior parte dei casi causerà il mancato caricamento di uno script.

Tipi MIME JavaScript legacy

Oltre al tipo MIME text/javascript, per ragioni storiche, il MIME Sniffing Standard (la definizione di come i browser dovrebbero interpretare i tipi MIME e capire cosa fare con i contenuti che non ne hanno uno valido) consente anche di fornire JavaScript utilizzando uno qualsiasi dei seguenti tipi MIME JavaScript legacy:

  • application/javascript
  • application/ecmascript
  • application/x-ecmascript
  • application/x-javascript
  • text/ecmascript Deprecated
  • text/javascript1.0
  • text/javascript1.1
  • text/javascript1.2
  • text/javascript1.3
  • text/javascript1.4
  • text/javascript1.5
  • text/jscript
  • text/livescript
  • text/x-ecmascript
  • text/x-javascript
Nota

Nota: anche se un qualsiasi user agent può supportare uno o tutti questi, dovresti usare solo text/javascript. È l’unico tipo MIME garantito per funzionare ora e in futuro.

Tipi di immagine
I file il cui tipo MIME è image contengono dati di immagine. Il sottotipo specifica quale formato di file di immagine specifico rappresentano i dati.

I seguenti tipi di immagine sono usati abbastanza comunemente da essere considerati sicuri per l’uso nelle pagine web:

  • image/apng: Animated Portable Network Graphics (APNG)
  • image/avif: AV1 Image File Format (AVIF)
  • image/gif: Graphics Interchange Format (GIF)
  • image/jpeg: Joint Photographic Expert Group image (JPEG)
  • image/png: Portable Network Graphics (PNG)
  • image/svg+xml: Scalable Vector Graphics (SVG)
  • image/webp: Web Picture Format (WEBP)

La guida al tipo e al formato di file di immagine fornisce informazioni e consigli su quando utilizzare i diversi formati di immagine.

Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)

--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg

(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"

(data)
--aBoundaryString
(more subparts)
--aBoundaryString--

Il seguente form:

form-html.

form-html.

Manderà questo messaggio:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465

-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"

Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"

on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain

Simple file.
-----------------------------8721656041911415653955004498--

multipart/byteranges

Il tipo MIME multipart/byteranges viene utilizzato per inviare risposte parziali al browser.

Quando viene inviato il codice di stato 206 Partial Content, questo tipo MIME indica che il documento è composto da più parti, una per ciascuno degli intervalli richiesti. Come altri tipi multipart, Content-Type utilizza un confine per separare le parti. Ogni parte ha un’intestazione Content-Type con il suo tipo effettivo e un Content-Range dell’intervallo che rappresenta.

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385

--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />

Importanza dell'impostazione del tipo MIME corretto

Alcune configurazioni del server possono utilizzare il tipo MIME associato per eseguire ottimizzazioni, come la concatenazione, la compressione o la memorizzazione nella cache dei file. Vedere h5bp/server-configs-apache per un esempio di una configurazione Apache che comprime i file di determinati tipi MIME.

La maggior parte dei server Web invia risorse non riconosciute come tipo MIME application/octet-stream. Per motivi di sicurezza, la maggior parte dei browser non consente di impostare un'azione predefinita personalizzata (come "Apri in Word") per tali risorse, costringendo l'utente a salvarla su disco per utilizzarla.

Alcune configurazioni server errate comuni:

  • File compressi in RAR. In questo caso, l'ideale sarebbe il tipo reale dei file originali; questo è spesso impossibile poiché i file .RAR possono contenere diverse risorse di tipi diversi. In questo caso, configurare il server per inviare application/x-rar-compressed.
  • Audio e video. Solo le risorse con il tipo MIME corretto verranno riprodotte negli elementi.video o audio. Assicurati di specificare il tipo di supporto corretto per audio e video.
  • Tipi di file proprietari. Un tipo specifico come application/vnd.mspowerpoint consente agli utenti di aprire automaticamente tali file nel software di presentazione di loro scelta.

MIME sniffing

In assenza di un tipo MIME, o in alcuni casi in cui i browser ritengono che siano errati, i browser possono eseguire MIME sniffing, ovvero indovinare il tipo MIME corretto esaminando i byte della risorsa.

Ogni browser esegue MIME sniffing in modo diverso e in circostanze diverse. (Ad esempio, Safari esaminerà l'estensione del file nell'URL se il tipo MIME inviato non è idoneo.) Ci sono problemi di sicurezza poiché alcuni tipi MIME rappresentano contenuto eseguibile. I server possono impedire MIME sniffing inviando l'intestazione X-Content-Type-Options.

Altri metodi di trasmissione del tipo di documento

I tipi MIME non sono l'unico modo per trasmettere informazioni sul tipo di documento:

  • A volte vengono utilizzati suffissi di nomi di file, in particolare su Microsoft Windows. Non tutti i sistemi operativi considerano questi suffissi significativi (come Linux e macOS) e non vi è alcuna garanzia che siano corretti.
  • Numeri magici. La sintassi di diversi formati consente l'inferenza del tipo di file esaminando la loro struttura in byte. Ad esempio, i file GIF iniziano con il valore esadecimale 47 49 46 38 39 (GIF89) e i file PNG con 89 50 4E 47 (.PNG). Non tutti i tipi di file hanno numeri magici, quindi anche questo non è affidabile al 100%