Bộ mã hóa tệp Base64
Mã hóa bất kỳ tệp nào sang Base64: PDF, ZIP, ảnh và hơn thế
Thả bất kỳ tệp nào vào đây hoặc nhấp để tải lên
Mọi loại tệp: PDF, ZIP, ảnh, tệp nhị phân
Mã hóa tệp Base64 là gì?
Mã hóa tệp Base64 chuyển đổi các tệp nhị phân — PDF, ZIP, ảnh, tệp thực thi, phông chữ, âm thanh — thành văn bản ASCII thuần túy sử dụng bảng chữ cái được định nghĩa trong RFC 4648. Mỗi ba byte đầu vào nhị phân trở thành bốn ký tự Base64, tạo ra một biểu diễn văn bản có thể truyền qua các kênh được thiết kế riêng cho văn bản: JSON API payload, tài liệu XML, nội dung email, thuộc tính HTML và biến môi trường.
Khác với mã hóa văn bản sang Base64 (hoạt động trên chuỗi ký tự), mã hóa tệp sang Base64 đọc luồng byte thô của bất kỳ tệp nào bất kể định dạng. Header nhị phân của PDF, các khối nén của ZIP và dữ liệu pixel của PNG đều được xử lý giống nhau: như một chuỗi octet cần tái mã hóa. Kết quả luôn là ASCII hợp lệ, an toàn để nhúng ở bất kỳ nơi nào chấp nhận ký tự có thể in được.
Sự đánh đổi là kích thước: đầu ra Base64 lớn hơn khoảng 33% so với nhị phân gốc. Với tệp PDF 1 MB, điều đó có nghĩa là khoảng 1,33 MB văn bản Base64. Chi phí này là cái giá phải trả khi biểu diễn các byte 8-bit bằng các ký tự 6-bit và là đặc tính cố hữu của mã hóa — không một triển khai nào có thể tránh khỏi. Dù vậy, mã hóa tệp Base64 vẫn là phương pháp chuẩn để nhúng dữ liệu nhị phân vào các định dạng chỉ chứa văn bản, được quy định trong MIME (RFC 2045), data URI (RFC 2397) và JSON Web Token (RFC 7519).
Tại sao dùng công cụ mã hóa tệp Base64 này?
Công cụ này mã hóa tệp sang Base64 trực tiếp trong trình duyệt của bạn sử dụng FileReader API. Không có tệp nào được tải lên máy chủ — toàn bộ quá trình chuyển đổi diễn ra phía máy khách bằng JavaScript.
Các trường hợp sử dụng mã hóa tệp Base64
Chi phí kích thước tệp Base64
Mã hóa Base64 tăng kích thước dữ liệu lên đúng một phần ba. Mỗi 3 byte đầu vào tạo ra 4 ký tự đầu ra (mỗi ký tự biểu diễn 6 bit). Ký tự đệm (=) được thêm vào khi độ dài đầu vào không phải bội số của 3. Bảng dưới đây cho thấy mối quan hệ giữa kích thước tệp gốc và kích thước đầu ra sau mã hóa.
| Kích thước tệp | Byte thô | Byte Base64 | Chi phí |
|---|---|---|---|
| 1 KB | 1,024 B | 1,368 B | +33.3% |
| 10 KB | 10,240 B | 13,656 B | +33.4% |
| 100 KB | 102,400 B | 136,536 B | +33.3% |
| 1 MB | 1,048,576 B | 1,398,104 B | +33.3% |
| 5 MB | 5,242,880 B | 6,990,508 B | +33.3% |
| 10 MB | 10,485,760 B | 13,981,016 B | +33.3% |
Tham chiếu Data URI và MIME Type
Data URI nhúng nội dung tệp trực tiếp vào HTML, CSS hay JavaScript theo định dạng data:[MIME type];base64,[encoded data]. MIME type cho trình duyệt biết cách diễn giải các byte đã giải mã. Dưới đây là các phần mở rộng tệp phổ biến, MIME type tương ứng và tiền tố data URI.
| Phần mở rộng | MIME Type | Tiền tố Data URI |
|---|---|---|
| application/pdf | data:application/pdf;base64,... | |
| .zip | application/zip | data:application/zip;base64,... |
| .png | image/png | data:image/png;base64,... |
| .jpg | image/jpeg | data:image/jpeg;base64,... |
| .gif | image/gif | data:image/gif;base64,... |
| .svg | image/svg+xml | data:image/svg+xml;base64,... |
| .woff2 | font/woff2 | data:font/woff2;base64,... |
| .mp3 | audio/mpeg | data:audio/mpeg;base64,... |
| .wasm | application/wasm | data:application/wasm;base64,... |
| .bin | application/octet-stream | data:application/octet-stream;base64,... |
Ví dụ mã
Các ví dụ có thể chạy này cho thấy cách đọc tệp nhị phân và mã hóa sang Base64 trong JavaScript, Python, Node.js, bash và Go. Mỗi đoạn mã tạo ra Base64 chuẩn (RFC 4648 Phần 4) có đệm.
// Read a file from an <input> element and encode to Base64
const input = document.querySelector('input[type="file"]')
input.addEventListener('change', (e) => {
const file = e.target.files[0]
const reader = new FileReader()
reader.onload = () => {
const base64 = reader.result.split(',')[1]
console.log(base64) // → "JVBERi0xLjQK..." (raw Base64, no data URI prefix)
}
reader.readAsDataURL(file)
})
// Convert a Blob to Base64 with async/await
async function blobToBase64(blob) {
const buffer = await blob.arrayBuffer()
const bytes = new Uint8Array(buffer)
let binary = ''
bytes.forEach(b => binary += String.fromCharCode(b))
return btoa(binary) // → standard Base64 string
}import base64
from pathlib import Path
# Encode a file to Base64
file_bytes = Path('document.pdf').read_bytes()
encoded = base64.b64encode(file_bytes).decode('ascii')
print(encoded[:40]) # → "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PA..."
# Write encoded output to a text file
Path('document.b64.txt').write_text(encoded)
# Build a data URI from a file
mime_type = 'application/pdf'
data_uri = f'data:{mime_type};base64,{encoded}'
print(data_uri[:60]) # → "data:application/pdf;base64,JVBERi0xLj..."import { readFileSync, writeFileSync } from 'fs'
// Encode a file to Base64
const buffer = readFileSync('archive.zip')
const base64 = buffer.toString('base64')
console.log(base64.length) // → 1398104 (for a ~1 MB file)
// Save Base64 output to a file
writeFileSync('archive.b64.txt', base64)
// Build a data URI
const mime = 'application/zip'
const dataUri = `data:${mime};base64,${base64}`# Encode a file to Base64 (macOS / Linux) base64 < document.pdf > document.b64.txt # Encode with no line wrapping (GNU coreutils) base64 -w 0 < document.pdf > document.b64.txt # Encode and copy to clipboard (macOS) base64 < image.png | pbcopy # Encode with OpenSSL (available everywhere) openssl base64 -in archive.zip -out archive.b64.txt # Pipe directly into curl for API upload base64 -w 0 < photo.jpg | curl -X POST -d @- https://api.example.com/upload
package main
import (
"encoding/base64"
"fmt"
"os"
)
func main() {
data, err := os.ReadFile("document.pdf")
if err != nil {
panic(err)
}
encoded := base64.StdEncoding.EncodeToString(data)
fmt.Println(len(encoded)) // → 1398104 (for a ~1 MB file)
// Write to file
os.WriteFile("document.b64.txt", []byte(encoded), 0644)
}