Saltar al contenido

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.

type/subtype text/* image/* audio/* video/* application/* text/plain text/html text/css text/csv image/jpeg image/png image/webp image/svg+xml audio/mpeg audio/wav audio/ogg video/mp4 video/webm video/quicktime application/pdf application/json application/zip application/octet-stream
Diagrama: jerarquía de tipos MIME (tipo de nivel superior → subtipo)

Imágenes (image)

Extensión Tipo MIME Significado
.jpg / .jpegimage/jpegImagen JPEG. Compresión con pérdida, ideal para fotografías
.pngimage/pngImagen PNG. Sin pérdida y con transparencia
.gifimage/gifImagen GIF. Animada, limitada a 256 colores
.webpimage/webpImagen WebP. El formato de alta compresión de Google
.avifimage/avifImagen AVIF. Formato de nueva generación basado en AV1
.svgimage/svg+xmlImagen vectorial SVG. Basada en XML
.icoimage/x-iconArchivo de icono, usado para favicons y similares
.bmpimage/bmpImagen de mapa de bits. Sin comprimir
.tiff / .tifimage/tiffImagen TIFF, usada en impresión y autoedición

Documentos (application)

Extensión Tipo MIME Significado
.pdfapplication/pdfDocumento PDF
.docapplication/mswordMicrosoft Word (formato antiguo)
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentMicrosoft Word (OOXML)
.xlsapplication/vnd.ms-excelMicrosoft Excel (formato antiguo)
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetMicrosoft Excel (OOXML)
.pptapplication/vnd.ms-powerpointMicrosoft PowerPoint (formato antiguo)
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentationMicrosoft PowerPoint (OOXML)

Texto (text)

Extensión Tipo MIME Significado
.txttext/plainTexto plano
.html / .htmtext/htmlDocumento HTML
.csstext/cssHoja de estilos CSS
.csvtext/csvTexto separado por comas
.xmltext/xmlDocumento XML
.jstext/javascriptJavaScript (application/javascript también es válido)
.jsonapplication/jsonDatos JSON
.mdtext/markdownTexto Markdown

Audio (audio)

Extensión Tipo MIME Significado
.mp3audio/mpegAudio MP3. El formato de audio más extendido
.wavaudio/wavAudio WAV. PCM sin comprimir
.oggaudio/oggAudio Ogg Vorbis
.flacaudio/flacAudio FLAC. Sin pérdida
.aacaudio/aacAudio AAC. El sucesor de MP3
.webmaudio/webmAudio WebM
.m4aaudio/mp4Audio MPEG-4

Vídeo (video)

Extensión Tipo MIME Significado
.mp4video/mp4Vídeo MP4. El formato de vídeo más extendido
.webmvideo/webmVídeo WebM. Formato abierto pensado para la web
.avivideo/x-msvideoVídeo AVI
.movvideo/quicktimeVídeo QuickTime
.mkvvideo/x-matroskaContenedor de vídeo Matroska
.mpegvideo/mpegVídeo MPEG

Archivos y compresión (application)

Extensión Tipo MIME Significado
.zipapplication/zipArchivo ZIP
.gz / .gzipapplication/gzipArchivo comprimido con Gzip
.tarapplication/x-tarArchivo tar
.tar.gzapplication/gzipArchivo tar comprimido con gzip
.rarapplication/vnd.rarArchivo RAR
.7zapplication/x-7z-compressedArchivo 7-Zip
.bz2application/x-bzip2Archivo comprimido con Bzip2

Fuentes (font)

Extensión Tipo MIME Significado
.wofffont/woffWeb Open Font Format
.woff2font/woff2WOFF2. Mejor compresión que WOFF
.ttffont/ttfFuente TrueType
.otffont/otfFuente OpenType

Otros

Extensión Tipo MIME Significado
(desconocida)application/octet-streamDatos binarios genéricos. El valor por defecto para formatos desconocidos
.wasmapplication/wasmBinario 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

  1. Comprobación de la extensión — rápida, pero se burla renombrando el archivo. Trátala como una ayuda de UX, nada más.
  2. El tipo MIME que envía el cliente (el Content-Type dentro del límite multipart) — igual de fácil de falsificar. El navegador lo deduce de la extensión, sin más.
  3. Detección de magic bytes (firma de archivo) — lee los primeros bytes reales y compáralos con la firma conocida (FF D8 FF para JPEG, 89 50 4E 47 para 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.