如何把文件转为 Base64
- 把一个或多个文件拖到框中,使用文件选择器,或用 Ctrl+V 粘贴已复制的文件。
- 选择 输出为:纯 Base64(此页默认)、Data URI、HTML
<a download>、JSON,以及图片和字体相关的包装格式。 - 可选:URL 安全(- _) 会把
+和/换成-和_;每 76 字符换行 会为 MIME 电子邮件分行。 - 按 复制输出,或按 另存为 .txt 得到
filename.ext.b64.txt。
有多个文件时,列表会显示每个文件名及其原始大小和编码后的大小。显示 用于查看单个结果,全部复制为 JSON 会把所有文件复制为 {name, type, size, data} 对象组成的数组,可以直接粘贴到测试数据文件或种子脚本中。
输出选项对非图片文件的含义
| 输出为 | report.zip 的结果 | 用途 |
|---|---|---|
| 纯 Base64 | UEsDBBQAAAAI... | API 字段、环境变量、配置值 |
| Data URI | data:application/zip;base64,UEsDBBQA... | HTML 或 JavaScript 中的 URL |
HTML <a download> | <a href="data:application/zip;base64,..." download="report.zip">report.zip</a> | 自包含的下载链接 |
| JSON | {"name": "report.zip", "type": "application/zip", "size": 323, "data": "UEsDBBQA..."} | 测试数据、你自己的上传接口 |
JSON 的键是固定的(name、type、size、data)。如果 API 要求其他名称,粘贴后再改名。size 是原始文件的字节数,接收方可以用它核对解码后的长度。
data URI 中的 MIME 类型和 JSON 中的 type 来自你的浏览器。浏览器不认识该文件时,工具会根据扩展名猜测;如果还是不行,就使用 application/octet-stream。受影响的只是标签,Base64 本身无论如何都一样。
CI 密钥和配置中的二进制文件
把整个文件编码的一个常见原因,是密钥存储只能保存文本:CI 变量、.env 文件、Kubernetes Secret。签名用的 keystore、证书和服务账号文件以一行 Base64 存入,再在流水线中还原:
echo "$KEYSTORE_B64" | base64 -d > release.keystore
这种场景请关闭 每 76 字符换行。带换行的值经常被密钥管理界面或 shell 弄乱。Kubernetes 在 data: 下就是这样存储每个值的,Kubernetes Secret 解码器 可以把它们读出来。
从开头几个字符判断编码的是什么
大多数文件格式的开头几个字节是固定的签名,所以不用解码,看 Base64 的开头就知道类型。几个常见的例子:
| 文件类型 | Base64 开头 |
|---|---|
JVBERi0 | |
| ZIP、DOCX、XLSX、PPTX、JAR、APK | UEsDB |
gzip(.gz、.tgz) | H4sI |
| 7-Zip | N3q8ryc |
| Windows EXE 或 DLL | TVqQ(大多数文件),一定以 TV 开头 |
| Linux ELF 二进制文件 | f0VMRg |
| SQLite 数据库 | U1FMaXRlIGZvcm1hdCAz |
| 带 ID3 标签的 MP3 | SUQz |
| PNG | iVBORw0KGgo |
| JSON 对象 | eyJ(对应 {") |
更完整的列表见 常见的 Base64 前缀。用 Base64 转文件 解码时,也是用同样的方法识别类型。
大小、内存和大文件
Base64 输出是输入的 4/3,向上取整到 4 个字符的倍数。1 MB 的文件变成 1,398,104 个字符,开启 每 76 字符换行 还会再多 18,396 个换行字符。输出下方的计数器会显示两个大小以及额外开销的百分比。
一切都在浏览器标签页中运行,所以实际限制取决于设备的内存:
- 文本框只显示输出的前 4 MB;复制输出 和 另存为 .txt 始终使用完整结果。
- 输出超过约 48 MB 时,复制输出 不可用。
- 大于约 48 MB 的文件会分块编码,结果只能通过 另存为 .txt 获取。
如果文件这么大,不妨想想 Base64 是否是合适的传输方式。multipart 上传或直接传输二进制数据可以避免 33% 的额外开销,也能避免两端的内存峰值。大小计算器 可以在开始之前算出编码后的大小。
在命令行或代码中编码文件
Linux,使用 GNU coreutils(-w 0 关闭默认的 76 字符换行):
base64 -w 0 report.zip > report.zip.b64
macOS(那里的 base64 默认不换行):
base64 -i report.zip -o report.zip.b64
Windows PowerShell:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\data\report.zip")) | Set-Content report.zip.b64
Python:
import base64
from pathlib import Path
encoded = base64.b64encode(Path("report.zip").read_bytes()).decode("ascii")
不把大文件整个载入内存的流式处理方法,见 Python 中的 Base64、Node.js、Java 和 PHP。
常见问题
- 输出中有换行。 GNU
base64默认每 76 个字符换行,openssl base64每 64 个字符换行,certutil -encode还会加上头部行。很多 JSON API 和环境变量需要单行。请使用-w 0、openssl base64 -A,或在本工具中关闭换行。 - data URI 中是
application/octet-stream。 浏览器不知道文件类型,扩展名也不在工具的列表中。字节本身仍然正确;如果接收方在意,请替换前缀中的 MIME 类型。 - 复制输出按钮是灰色的。 结果超过了约 48 MB 的复制上限。另存为 .txt 仍然可用,大多数需要该字符串的工具也能从文件中读取。
- JSON 中某个文件是
"data": null。 批量处理时,超过约 48 MB 的文件会分块编码、只供下载,所以 全部复制为 JSON 不包含它们的数据。请单独编码该文件并保存为 .txt。 - 解码出的文件比原文件小。 字符串被截断了。请把解码后的长度与 JSON 输出中的
size值对比。 - 输入是文本时输出出现乱码。 Base64 会原样保留字节,包括原来的字符编码。UTF-16 的文本文件解码出来还是 UTF-16,而不是 UTF-8。对于手动输入的文本,请使用 文本转 Base64,它可以选择字符集。
常见问题
哪些类型的文件可以转为 Base64?
任何文件都可以。Base64 编码的是字节,不关心字节的含义,所以可执行文件、压缩包、数据库和文档与文本的处理方式完全相同。PDF 转 Base64 等针对特定格式的页面只是额外提供了该格式的提示。
文件大小有限制吗?
没有固定限制,因为处理都在你的浏览器中完成。输出不超过约 48 MB 时可以复制,更大时请用 另存为 .txt。超过约 48 MB 的文件会分块编码,只提供下载。
在 Windows 上不装额外工具,怎样把文件编码为 Base64?
PowerShell 一行即可:[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\path\file.bin"))。certutil -encode 也可以,但它会加上 -----BEGIN CERTIFICATE----- 行并对输出换行,之后还得手动去掉。
data URI 使用哪种 MIME 类型?
使用浏览器为该文件报告的类型。如果浏览器没有报告,工具会根据扩展名猜测,猜不出来就用 application/octet-stream。接收方需要特定类型时,请手动修改前缀。
怎样把 Base64 解码还原成文件?
使用 Base64 转文件。它会根据解码后的字节识别文件类型,并建议合适的扩展名。