掌握 Base64 用于前端开发
全面的理解指南 Base64 现代网页设计中的编码、解码和实际应用。
尝试 Base64 编码/解码
到底是什么 Base64?
Base64 是一种二进制到文本的编码方案,可将二进制数据(如图像、文件或原始字节)转换为 ASCII 字符。这种转换允许二进制数据安全地传输并存储在专为纯文本数据设计的系统中,例如电子邮件协议、HTML 或 API 响应。
“Base64”这个名字来源于它使用 64 个不同的字符(A-Z、a-z、0-9、‘+’和‘/’)来表示二进制值。每个 Base64 字符对 6 位数据进行编码,使其成为在以文本为中心的环境中处理二进制内容的有效方法。
与加密不同的是, Base64 不是一种安全措施——它纯粹是为了数据格式化。任何人都可以使用基本工具解码 Base64 内容,因此永远不应该使用它来保护敏感信息。
Base64 字符集
* “=”作为不完整数据的填充字符
怎么样 Base64 编码工作?
-
1
将二进制数据转换为 8 位字节
该过程从二进制数据(例如图像文件)开始。该数据被分成 8 位(1 字节)段,形成原始输入 Base64 编码。
-
2
将字节分组为 24 位块
自从 Base64 使用 6 位字符,8 位字节被分组为 24 位(3 字节)块。 24 位可以平均分为 4 个 6 位段(4 × 6 = 24)。
-
3
将 6 位段转换为 Base64 字符
每个 6 位段都转换为十进制值 (0–63)。然后将该值映射到相应的字符 Base64 字符集(例如,0 =“A”、1 =“B”、...、63 =“/”)。
-
4
为不完整的块添加填充
如果二进制数据长度不是 3 字节的倍数,则最终块将不完整。 Base64 使用“=”填充字符来指示丢失的字节(1 个“=”表示丢失 1 个字节,2 个“=”表示丢失 2 个字节)。
Base64 编码示例:文本“Hi!”
| 步 | 输入数据 | 二进制表示 | Base64 输出 |
|---|---|---|---|
| 1. 原始文本 | “你好!” | - | - |
| 2. 8 位字节 (ASCII) | H (72),我 (105),! (33) | 01001000, 01101001, 00100001 | - |
| 3. 24位块 | 72、105、33 | 010010000110100100100001 | - |
| 4. 分成 6 位段 | - | 010010、000110、100100、100001 | - |
| 5. 转换为十进制 | - | - | 18、6、36、33 |
| 6. 映射到 Base64 字符 | - | - | “皮肤” |
前端 Base64 使用案例
图像的数据 URL
使用以下命令将小图像(如图标或头像)直接嵌入到 HTML/CSS 中 Base64 数据 URL。这减少了 HTTP 请求并提高了小型资源的页面加载速度。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." alt="Icon">
API二进制数据传输
通过 REST API 传输二进制数据(如文件或 PDF),将其编码为 Base64。这可以避免基于文本的 API 负载(例如 JSON)中的二进制数据损坏问题。
{ "fileData": "JVBERi0xLjQKJeLjz9MNCjYgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlciAvRmxhdGVEZWNvZGU+PgpzdHJlYW0KeAovRjEgMTAgVGYKMDAwLjEwNS4wMDAuMTAwCjAwMC4yOTkuMDAwLjAwMAo...", "fileName": "report.pdf" }
Cookie 和 LocalStorage 文本约束
通过将小型二进制数据编码为,将其存储在 cookie 或 LocalStorage(仅支持文本)中 Base64。对于在本地保存用户首选项或小型资产很有用。
// Save Base64 data to LocalStorage
localStorage.setItem('userAvatar', 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...');
电子邮件附件编码
大多数电子邮件协议(如 SMTP)都是纯文本的。 Base64 用于对电子邮件附件(图像、文档)进行编码,以便它们可以在不损坏的情况下进行传输。
Content-Type: image/jpeg; name="photo.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="photo.jpg"
/9j/4AAQSkZJRgABAQEAZABkAAD/7QBsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA...
内联 SVG 编码
将 SVG 文件编码为 Base64 用于 CSS 背景或 HTML 属性中的内联使用。这简化了小型矢量图形的资源管理。
.icon {
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDJBMTAgMTAgMCAwIDEgMjIgMTJBMTAgMTAgMCAwIDEgMTIgMjJBMTAgMTAgMCAwIDEgMiAxMkExMCAxMCAwIDAgMSAxMiAyWiIgc3Ryb2tlPSIjMTY1REZGIiBzdHJva2Utd2lkdGg9IjIiLz48L3N2Zz4=');
}
画布图像导出
HTML5 Canvas API 使用 Base64 将绘制的内容导出为图像数据(通过 toDataURL())。这可以保存用户生成的艺术作品或屏幕截图。
// Get Base64 data from Canvas
const canvas = document.getElementById('myCanvas');
const base64Image = canvas.toDataURL('image/png'); // "data:image/png;base64,iVBORw0KGgo..."
前端 Base64 代码示例
基本的 Base64 编码/解码
使用 JavaScript 的内置 btoa() (二进制到 ASCII)和 atob() (ASCII 到二进制)函数用于简单 Base64 运营。注意:这些函数适用于 UTF-8 字符串。
// Encode text to Base64
function encodeToBase64(text) {
// Encode UTF-8 to avoid issues with special characters
const utf8Text = unescape(encodeURIComponent(text));
return btoa(utf8Text);
}
// Decode Base64 to text
function decodeFromBase64(base64String) {
const utf8Text = atob(base64String);
return decodeURIComponent(escape(utf8Text));
}
// Example usage
const originalText = "Hello, Base64!";
const encodedText = encodeToBase64(originalText);
const decodedText = decodeFromBase64(encodedText);
console.log("Original:", originalText); // "Hello, Base64!"
console.log("Encoded:", encodedText); // "SGVsbG8sIEJhc2U2NCE="
console.log("Decoded:", decodedText); // "Hello, Base64!"
将图像编码为 Base64
将图像文件(通过文件输入选择)转换为 Base64 使用 FileReader API。对于在上传或内联嵌入图像之前预览图像很有用。
// Get elements from DOM
const fileInput = document.getElementById('image-upload');
const previewImage = document.getElementById('image-preview');
const base64Output = document.getElementById('image-base64');
// Handle file selection
fileInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (!file || !file.type.startsWith('image/')) {
alert('Please select an image file!');
return;
}
// Create FileReader to read the image
const reader = new FileReader();
// On load, get Base64 data
reader.onload = (event) => {
const base64Data = event.target.result;
// Preview the image
previewImage.src = base64Data;
previewImage.style.display = 'block';
// Show Base64 data (truncated for readability)
const truncatedData = base64Data.length > 100
? base64Data.substring(0, 100) + '...'
: base64Data;
base64Output.textContent = truncatedData;
};
// Read the file as Base64
reader.readAsDataURL(file);
});
Base64 数据(截断):
Base64 到 Blob(下载文件)
转变 Base64 将数据返回到 Blob(二进制大对象)以在浏览器中创建可下载文件(例如 PDF、图像)。
// Convert Base64 to Blob
function base64ToBlob(base64Data, contentType = 'application/octet-stream') {
// Extract Base64 data (remove "data:..." prefix if present)
const base64WithoutPrefix = base64Data.startsWith('data:')
? base64Data.split(',')[1]
: base64Data;
// Decode Base64 to binary string
const binaryString = atob(base64WithoutPrefix);
const byteLength = binaryString.length;
// Convert binary string to Uint8Array
const uint8Array = new Uint8Array(byteLength);
for (let i = 0; i < byteLength; i++) {
uint8Array[i] = binaryString.charCodeAt(i);
}
// Create and return Blob
return new Blob([uint8Array], { type: contentType });
}
// Trigger file download from Blob
function downloadBlobAsFile(blob, fileName) {
// Create temporary URL for Blob
const url = URL.createObjectURL(blob);
// Create anchor element to trigger download
const a = document.createElement('a');
a.href = url;
a.download = fileName;
// Simulate click to start download
document.body.appendChild(a);
a.click();
// Clean up
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
// Example: Download Base64 PDF
const base64Pdf = "JVBERi0xLjQKJeLjz9MNCjYgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlciAvRmxhdGVEZWNvZGU+PgpzdHJlYW0KeAovRjEgMTAgVGYKMDAwLjEwNS4wMDAuMTAwCjAwMC4yOTkuMDAwLjAwMAo...";
const pdfBlob = base64ToBlob(base64Pdf, 'application/pdf');
downloadBlobAsFile(pdfBlob, 'report.pdf');
Vue.js Base64 成分
可重用的 Vue.js 组件 Base64 编码/解码。与 Vue 的反应系统集成以进行实时更新。
<template>
<div class="base64-converter">
<h3 class="text-lg font-semibold mb-4">Vue Base64 Converter</h3>
<!-- Input for text -->
<div class="mb-4">
<label class="block mb-2 text-sm font-medium">Enter Text:</label>
<textarea
v-model="inputText"
class="w-full p-2 border rounded"
rows="3"
placeholder="Type text to encode..."
></textarea>
<button
@click="encode"
class="mt-2 px-4 py-1 bg-primary text-white rounded"
>Encode to Base64</button>
</div>
<!-- Output for Base64 -->
<div class="mb-4">
<label class="block mb-2 text-sm font-medium">Base64 Result:</label>
<textarea
v-model="base64Output"
class="w-full p-2 border rounded"
rows="3"
readonly
></textarea>
<button
@click="decode"
class="mt-2 px-4 py-1 bg-secondary text-white rounded"
>Decode to Text</button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
inputText: '',
base64Output: ''
};
},
methods: {
encode() {
if (!this.inputText) return;
// Encode UTF-8 text to Base64
const utf8Text = unescape(encodeURIComponent(this.inputText));
this.base64Output = btoa(utf8Text);
},
decode() {
if (!this.base64Output) return;
// Decode Base64 to UTF-8 text
const utf8Text = atob(this.base64Output);
this.inputText = decodeURIComponent(escape(utf8Text));
}
}
};
</script>
