ZIP を Base64 に変換する方法
.zipファイルをボックスにドロップするか、ファイル選択で選びます。- 出力形式 は最初 プレーン Base64 になっています。ファイル名、タイプ、サイズも一緒に必要なら JSON を、ダウンロードリンクなら HTML
<a download>を使います。 - 文字列を MIME メールの本文に入れるのでなければ、76 文字で折り返し はオフのままにします。
- 出力をコピー するか、大きなアーカイブなら .txt で保存 します。
先に ZIP、次にエンコード
Base64 は与えたものに約 3 分の 1 を加えます。圧縮はその前に、テキスト、JSON、CSV、HTML、ログを小さくしてくれるので、順序が重要です。219,398 バイトの JSON ファイル、HTML ページ、スタイルシートで小さなテストをしました。
| 方法 | 送る文字数 |
|---|---|
| JSON ファイルだけを Base64 エンコード | 292,532 |
| 3 つのファイルを ZIP にして(19,149 バイト)から Base64 | 25,532 |
画像、動画、MP3、既存のアーカイブはすでに圧縮されているのでほとんど小さくなりませんが、ZIP にまとめれば多数のファイルを 1 つのフィールドに収められます。テキストのペイロードが 1 つだけなら、gzip のほうが手軽です。gzip と Base64 を参照してください。
Base64 の ZIP が使われる場面
- デプロイや自動化の API:コードを実行したりサイトをホストしたりするサービスの中には、パッケージ全体を JSON リクエスト内の Base64 エンコードされた ZIP として受け付けるものがあります。
- CI とシークレットストア:証明書や設定ファイルのフォルダーを ZIP にして 1 つの Base64 シークレットとして保存し、パイプラインで
base64 -dを使って復元できます。 - 一括エクスポートと添付ファイル:レポートやインボイスの一式を、ファイルごとにフィールドを分けずに 1 回のリクエストで送ります。
コードで 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 はまったく圧縮しません。ストリーム処理や改行コードについては Python での Base64 で詳しく解説しています。
Base64 の ZIP を確認する
| Base64 の先頭 | 意味 |
|---|---|
UEsDBBQA | 最初のエントリの展開にバージョン 2.0 が必要な ZIP。圧縮されたエントリでは普通 |
UEsDBAoA | 最初のエントリはバージョン 1.0 で展開可能。非圧縮のエントリでこう書くツールがある |
UEsFBg | 空のアーカイブで、中身がない |
文字列が UEsFBg で始まる場合、アーカイブはファイルなしで作られています。ビルドスクリプトのパスの誤りでよく起こる結果です。Base64 を ZIP に は文字列をデコードして中のファイルを一覧表示するので、アーカイブに期待どおりの中身が入っているかを確かめる一番手早い方法です。
よくある質問
DOCX、XLSX、JAR ファイルも UEsDB で始まるのはなぜですか?
これらは内部構成が決まった ZIP アーカイブだからです。UEsDB は PK\x03\x04 の Base64 で、拡張子に関係なく、空でない ZIP はすべてこのローカルファイルヘッダーで始まります。
Base64 エンコードで ZIP はさらに圧縮されますか?
されません。Base64 はどんな入力も約 33% 大きくし、ZIP はすでに圧縮済みです。効果があるのは先に ZIP にすることで、圧縮できるファイルは Base64 のオーバーヘッドが加わる前に小さくなります。
パスワード付きの ZIP をエンコードできますか?
できます。暗号化されたアーカイブも、ほかのファイルと同じようにエンコードされます。展開するには、受け取った側にパスワードが必要です。