Cómo convertir un ZIP a Base64
- Suelta un archivo
.zipen el recuadro o elígelo con el selector de archivos. - Salida como empieza en Base64 simple. Usa JSON si quieres el nombre, el tipo y el tamaño del archivo al lado, o HTML
<a download>para un enlace de descarga. - Deja Ajustar a 76 desactivado salvo que la cadena vaya al cuerpo de un email MIME.
- Copiar salida, o Guardar como .txt para archivos grandes.
Primero comprimir, luego codificar
Base64 añade alrededor de un tercio a lo que le des. La compresión le quita tamaño al texto, JSON, CSV, HTML y logs antes de que eso ocurra, así que el orden importa. Una pequeña prueba con un archivo JSON de 219.398 bytes, una página HTML y una hoja de estilos:
| Método | Caracteres que enviar |
|---|---|
| Solo el archivo JSON, codificado en Base64 | 292,532 |
| Los tres archivos en un ZIP (19.149 bytes) y luego Base64 | 25,532 |
Las imágenes, los vídeos, los MP3 y los archivos ya comprimidos apenas se reducen, pero meterlos en un ZIP sigue convirtiendo muchos archivos en un solo campo. Para un único payload de texto, gzip es una opción más ligera; consulta Gzip y Base64.
Dónde se usan los ZIP en Base64
- API de despliegue y automatización: algunos servicios que ejecutan código o alojan sitios aceptan el paquete completo como un ZIP codificado en Base64 dentro de una petición JSON.
- CI y almacenes de secretos: una carpeta de certificados o archivos de configuración se puede comprimir y guardar como un solo secreto Base64, para restaurarla después en el pipeline con
base64 -d. - Exportaciones masivas y adjuntos: un conjunto de informes o facturas sale en una sola petición en lugar de un campo por archivo.
Crear el ZIP en código
Python puede crear el archivo en memoria y codificarlo sin escribir un archivo temporal:
import base64, io, zipfile
from pathlib import Path
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as z:
for path in Path("site").rglob("*"):
if path.is_file():
z.write(path, path.relative_to("site"))
package = base64.b64encode(buf.getvalue()).decode("ascii")
ZIP_DEFLATED es importante: el valor por defecto, ZIP_STORED, no comprime nada. Hay más sobre streaming y finales de línea en Base64 en Python.
Comprobar un ZIP en Base64
| El Base64 empieza por | Significado |
|---|---|
UEsDBBQA | ZIP cuya primera entrada necesita la versión 2.0 para extraerse, el caso habitual con entradas comprimidas |
UEsDBAoA | la primera entrada solo necesita la versión 1.0, que algunas herramientas escriben para entradas sin comprimir |
UEsFBg | un archivo vacío, sin nada dentro |
Si la cadena empieza por UEsFBg, el archivo se creó sin ningún fichero, algo que suele pasar por una ruta incorrecta en un script de build. Base64 a ZIP decodifica una cadena y lista los archivos que contiene, la forma más rápida de comprobar que el ZIP tiene lo que esperas.
Preguntas frecuentes
¿Por qué los archivos DOCX, XLSX y JAR también empiezan por UEsDB?
Son archivos ZIP con una estructura interna fija. UEsDB es el Base64 de PK\x03\x04, el encabezado de archivo local con el que empieza todo ZIP no vacío, tenga la extensión que tenga.
¿Codificar en Base64 comprime más un ZIP?
No. Base64 hace cualquier entrada alrededor de un 33 % más grande, y un ZIP ya está comprimido. La ganancia viene de comprimir primero: los archivos comprimibles se reducen antes de que se sume la sobrecarga de Base64.
¿Puedo codificar un ZIP protegido con contraseña?
Sí. Un archivo cifrado se codifica como cualquier otro archivo. El receptor seguirá necesitando la contraseña para extraerlo.