Referencia de tipos MIME
Una tabla de referencia de tipos MIME (media types), que identifican qué es un archivo. Útil al configurar un servidor web, fijar cabeceras Content-Type o validar subidas.
Qué es un tipo MIME
Los tipos MIME (Multipurpose Internet Mail Extensions) son la forma estándar de identificar el formato y la naturaleza de un archivo. Se escriben como tipo/subtipo e indican a navegadores y servidores cómo tratar el contenido. Se fijan en la cabecera Content-Type de la respuesta HTTP y en atributos como <input type="file" accept="..."> de HTML.
Imágenes (image)
| Extensión | Tipo MIME | Significado |
|---|---|---|
| .jpg / .jpeg | image/jpeg | Imagen JPEG. Compresión con pérdida, ideal para fotografías |
| .png | image/png | Imagen PNG. Sin pérdida y con transparencia |
| .gif | image/gif | Imagen GIF. Animada, limitada a 256 colores |
| .webp | image/webp | Imagen WebP. El formato de alta compresión de Google |
| .avif | image/avif | Imagen AVIF. Formato de nueva generación basado en AV1 |
| .svg | image/svg+xml | Imagen vectorial SVG. Basada en XML |
| .ico | image/x-icon | Archivo de icono, usado para favicons y similares |
| .bmp | image/bmp | Imagen de mapa de bits. Sin comprimir |
| .tiff / .tif | image/tiff | Imagen TIFF, usada en impresión y autoedición |
Documentos (application)
| Extensión | Tipo MIME | Significado |
|---|---|---|
application/pdf | Documento PDF | |
| .doc | application/msword | Microsoft Word (formato antiguo) |
| .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | Microsoft Word (OOXML) |
| .xls | application/vnd.ms-excel | Microsoft Excel (formato antiguo) |
| .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Microsoft Excel (OOXML) |
| .ppt | application/vnd.ms-powerpoint | Microsoft PowerPoint (formato antiguo) |
| .pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation | Microsoft PowerPoint (OOXML) |
Texto (text)
| Extensión | Tipo MIME | Significado |
|---|---|---|
| .txt | text/plain | Texto plano |
| .html / .htm | text/html | Documento HTML |
| .css | text/css | Hoja de estilos CSS |
| .csv | text/csv | Texto separado por comas |
| .xml | text/xml | Documento XML |
| .js | text/javascript | JavaScript (application/javascript también es válido) |
| .json | application/json | Datos JSON |
| .md | text/markdown | Texto Markdown |
Audio (audio)
| Extensión | Tipo MIME | Significado |
|---|---|---|
| .mp3 | audio/mpeg | Audio MP3. El formato de audio más extendido |
| .wav | audio/wav | Audio WAV. PCM sin comprimir |
| .ogg | audio/ogg | Audio Ogg Vorbis |
| .flac | audio/flac | Audio FLAC. Sin pérdida |
| .aac | audio/aac | Audio AAC. El sucesor de MP3 |
| .webm | audio/webm | Audio WebM |
| .m4a | audio/mp4 | Audio MPEG-4 |
Vídeo (video)
| Extensión | Tipo MIME | Significado |
|---|---|---|
| .mp4 | video/mp4 | Vídeo MP4. El formato de vídeo más extendido |
| .webm | video/webm | Vídeo WebM. Formato abierto pensado para la web |
| .avi | video/x-msvideo | Vídeo AVI |
| .mov | video/quicktime | Vídeo QuickTime |
| .mkv | video/x-matroska | Contenedor de vídeo Matroska |
| .mpeg | video/mpeg | Vídeo MPEG |
Archivos y compresión (application)
| Extensión | Tipo MIME | Significado |
|---|---|---|
| .zip | application/zip | Archivo ZIP |
| .gz / .gzip | application/gzip | Archivo comprimido con Gzip |
| .tar | application/x-tar | Archivo tar |
| .tar.gz | application/gzip | Archivo tar comprimido con gzip |
| .rar | application/vnd.rar | Archivo RAR |
| .7z | application/x-7z-compressed | Archivo 7-Zip |
| .bz2 | application/x-bzip2 | Archivo comprimido con Bzip2 |
Fuentes (font)
| Extensión | Tipo MIME | Significado |
|---|---|---|
| .woff | font/woff | Web Open Font Format |
| .woff2 | font/woff2 | WOFF2. Mejor compresión que WOFF |
| .ttf | font/ttf | Fuente TrueType |
| .otf | font/otf | Fuente OpenType |
Otros
| Extensión | Tipo MIME | Significado |
|---|---|---|
| (desconocida) | application/octet-stream | Datos binarios genéricos. El valor por defecto para formatos desconocidos |
| .wasm | application/wasm | Binario de WebAssembly |
Trabajar con tipos MIME
Configuración del servidor
Un servidor web como Apache o Nginx asocia extensiones a tipos MIME. Si esa asociación es incorrecta, el navegador no puede tratar el archivo como corresponde: un .webp sin el tipo adecuado se ofrece como descarga en vez de mostrarse como imagen.
Validación de subidas
Al construir una función de subida, comprueba el tipo MIME además de la extensión. Aun así, el tipo MIME puede falsificarse en el cliente, de modo que por seguridad conviene verificar también los magic bytes del inicio del archivo.
La cabecera Content-Type
Fija un Content-Type preciso en las respuestas de API y en las descargas: application/json para JSON y text/csv para CSV. Cuando haya que declarar la codificación, añade el parámetro charset, como en text/html; charset=utf-8.
Declarar tipos MIME en la configuración del servidor
A continuación, los fragmentos que se usan al servir formatos modernos —WebP, AVIF, WASM, fuentes web— que suelen faltar en la asignación por defecto del servidor.
Apache .htaccess
# Formatos de imagen modernos
AddType image/webp .webp
AddType image/avif .avif
AddType image/svg+xml .svg .svgz
# Fuentes: cachéalas de forma agresiva
AddType font/woff .woff
AddType font/woff2 .woff2
# WebAssembly y las variantes modernas de JSON
AddType application/wasm .wasm
AddType application/manifest+json .webmanifest
AddType application/ld+json .jsonld
# Sirve el texto como UTF-8
AddCharset utf-8 .html .css .js .json .xml
Nginx (sobrescribiendo mime.types)
types {
image/webp webp;
image/avif avif;
application/wasm wasm;
application/manifest+json webmanifest;
}
# Fuerza un charset en text/* y application/json
charset utf-8;
charset_types text/css text/plain text/xml application/javascript application/json application/xml;
PHP — enviar Content-Type
// Descargar un PDF con un nombre de archivo
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="invoice.pdf"');
readfile($path);
// Respuesta de API JSON: indica siempre el charset
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
Node.js / Express
// Express deduce el Content-Type de res.type() o de la extensión
app.get('/data.json', (req, res) => {
res.type('application/json').send({ ok: true });
});
// Transmitir un archivo con un MIME explícito
app.get('/report.csv', (req, res) => {
res.set('Content-Type', 'text/csv; charset=utf-8');
fs.createReadStream('report.csv').pipe(res);
});
Python — Flask / FastAPI
# Flask
from flask import Response
return Response(csv_text, mimetype='text/csv', headers={'Content-Disposition': 'attachment; filename="data.csv"'})
# FastAPI
from fastapi.responses import Response
return Response(content=json_str, media_type='application/json')
Go — net/http
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff") // Seguridad: ver abajo
json.NewEncoder(w).Encode(data)
Seguridad: por qué hace falta X-Content-Type-Options: nosniff
Históricamente, los navegadores han «olfateado» el contenido de un archivo para adivinar su tipo cuando faltaba la cabecera Content-Type o era incorrecta. Es un vector de ataque conocido: si un archivo subido como image/jpeg es en realidad HTML con una etiqueta <script>, el navegador puede interpretarlo como HTML y ejecutar el script.
Envía X-Content-Type-Options: nosniff en todas las respuestas. Le dice al navegador que confíe en el Content-Type declarado por el servidor en lugar de adivinar. Es imprescindible con archivos subidos por usuarios y con APIs JSON, donde se intenta reinterpretar el JSON como HTML o JavaScript.
Validación de subidas: la regla de tres capas
- Comprobación de la extensión — rápida, pero se burla renombrando el archivo. Trátala como una ayuda de UX, nada más.
- El tipo MIME que envía el cliente (el
Content-Typedentro del límite multipart) — igual de fácil de falsificar. El navegador lo deduce de la extensión, sin más. - Detección de magic bytes (firma de archivo) — lee los primeros bytes reales y compáralos con la firma conocida (
FF D8 FFpara JPEG,89 50 4E 47para PNG). Es la única capa fiable. Consulta la referencia de magic bytes para más detalle.
La regla en producción: haz las tres. Usa las dos primeras como filtros baratos que descartan la basura evidente, y la tercera como comprobación definitiva.
Preguntas frecuentes
¿Cuál es la diferencia entre application/json y text/json?
application/json es el tipo oficial registrado en la IANA y definido en el RFC 8259. text/json fue una grafía no oficial de algunos servidores antiguos; nunca se registró y conviene evitarla. Como la especificación de JSON obliga a UTF-8, el parámetro charset es técnicamente redundante: inofensivo si lo indicas, pero innecesario.
Los archivos .webp y .avif se descargan en lugar de mostrarse
El servidor no tiene asignación para esa extensión y recurre a application/octet-stream, así que el navegador lo toma por datos binarios desconocidos y ofrece la descarga. Añade las asignaciones image/webp e image/avif a la configuración de Apache o Nginx (ver los fragmentos anteriores).
¿Puedo fiarme del tipo MIME que envía el navegador al validar subidas?
No. El navegador deduce el tipo MIME únicamente de la extensión en el momento de seleccionar el archivo, así que renombrar malware.exe como cute-cat.jpg hace que informe image/jpeg sin más. Combina siempre las tres capas: extensión, MIME del cliente y detección de magic bytes.
¿Qué tipo MIME uso para archivos que el servidor no reconoce?
application/octet-stream. Está definido explícitamente como datos binarios arbitrarios y es el valor por defecto seguro: el navegador no intenta renderizarlo, ofrece la descarga, y así se evita una ejecución accidental.
¿Qué es el prefijo x- de application/x-www-form-urlencoded?
Históricamente, x- marcaba un tipo como experimental o no estándar. El RFC 6648 retiró la convención en 2012, pero tipos muy extendidos como application/x-www-form-urlencoded, image/x-icon y application/x-tar conservaron el prefijo por compatibilidad.
¿Debo añadir charset a tipos binarios como imágenes y PDF?
No. charset solo significa algo en tipos de texto: text/*, application/json, application/xml. En image/jpeg o application/pdf no aporta nada y algunos intermediarios (CDN, proxies) lo eliminan.