Как конвертировать ZIP в Base64
- Перетащите файл
.zipв поле или выберите его через диалог. - По умолчанию Формат вывода выдаёт Чистый Base64. Выберите JSON, если нужны ещё имя файла, тип и размер, или HTML
<a download>для ссылки на скачивание. - Не включайте Перенос по 76, если строка не идёт в тело MIME-письма.
- Нажмите Скопировать результат или, для больших архивов, Сохранить как .txt.
Сначала архив, потом кодирование
Base64 добавляет примерно треть к тому, что ему дают. Сжатие уменьшает текст, JSON, CSV, HTML и логи ещё до этого, поэтому порядок важен. Небольшой тест с JSON-файлом на 219 398 байт, HTML-страницей и таблицей стилей:
| Способ | Символов к отправке |
|---|---|
| Один только JSON-файл в Base64 | 292 532 |
| Все три файла в ZIP (19 149 байт), затем Base64 | 25 532 |
Картинки, видео, MP3 и готовые архивы уже сжаты и почти не уменьшаются, но упаковка в ZIP всё равно превращает много файлов в одно поле. Если текстовый файл всего один, проще взять gzip; см. Gzip и Base64.
Где используют ZIP в Base64
- API деплоя и автоматизации. Некоторые сервисы, которые запускают код или хостят сайты, принимают весь пакет как ZIP в Base64 внутри JSON-запроса.
- CI и хранилища секретов. Папку с сертификатами или конфигами можно запаковать и хранить как один секрет в Base64, а в пайплайне восстановить через
base64 -d. - Массовая выгрузка и вложения. Набор отчётов или счетов уходит одним запросом, без отдельного поля на каждый файл.
Сборка ZIP в коде
Python может создать архив в памяти и закодировать его без временного файла:
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 важен: режим по умолчанию ZIP_STORED вообще не сжимает. О потоковой обработке и окончаниях строк написано в статье Base64 в Python.
Проверка ZIP в Base64
| Base64 начинается с | Что это значит |
|---|---|
UEsDBBQA | ZIP, первой записи которого для распаковки нужна версия 2.0; обычный случай для сжатых записей |
UEsDBAoA | первой записи нужна только версия 1.0; некоторые программы так пишут несжатые записи |
UEsFBg | пустой архив, внутри ничего нет |
Если строка начинается с UEsFBg, архив создан без файлов; так часто бывает при неверном пути в скрипте сборки. Base64 в ZIP декодирует строку и показывает список файлов внутри: так быстрее всего убедиться, что в архиве лежит то, что вы ожидаете.
Вопросы и ответы
Почему DOCX, XLSX и JAR тоже начинаются с UEsDB?
Это ZIP-архивы с фиксированной внутренней структурой. UEsDB получается при кодировании PK\x03\x04, локального заголовка файла, с которого начинается любой непустой ZIP, какое бы у него ни было расширение.
Сжимает ли Base64 ZIP ещё сильнее?
Нет. Base64 увеличивает любые данные примерно на 33%, а ZIP уже сжат. Выигрыш даёт архивация до кодирования: сжимаемые файлы уменьшаются ещё до того, как добавятся накладные расходы Base64.
Можно ли закодировать ZIP с паролем?
Да. Base64 видит только байты, поэтому зашифрованный архив кодируется как любой другой. Чтобы распаковать его, получателю всё равно понадобится пароль.