file api 本身不支持加解密,需结合 arraybuffer、uint8array 和 web crypto api 实现:选文件→readasarraybuffer→转uint8array→aes-gcm加密→转blob下载或上传。

直接用 File API 本身不能加解密——它只负责读取、切分和传递二进制数据,真正的加解密必须依赖 ArrayBuffer + TypedArray + Web Crypto API(或第三方加密库)协同完成。关键在于把文件内容转成可操作的原始字节,再交给加密逻辑处理。
核心路径很清晰:选文件 → 读成 ArrayBuffer → 解析为 Uint8Array → 加密/解密 → 转回 Blob 下载或上传
如何把文件变成可加密的字节数组
File 对象本质是 Blob,但不暴露原始字节。必须用 FileReader.readAsArrayBuffer() 把它拉进内存:
const file = fileInput.files[0];
const reader = new FileReader();
reader.onload = () => {
const buffer = reader.result; // ArrayBuffer
const bytes = new Uint8Array(buffer); // 可逐字节操作的视图
// ✅ 现在可以传给加密函数了
};
reader.readAsArrayBuffer(file);
⚠️ 注意:同一个 FileReader 实例只能调用一次 readAsArrayBuffer();大文件建议配合 stream() 分块读取(Chrome 109+ 支持),避免内存溢出。
使用 Web Crypto API 做 AES 加密(现代浏览器原生支持)
比如对整个文件做 AES-GCM 加密:
async function encryptFile(bytes) {
// 生成密钥(实际中应安全导入或派生)
const key = await crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
// 生成随机 IV(12 字节推荐)
const iv = crypto.getRandomValues(new Uint8Array(12));
// 加密
const encrypted = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key.encrypt,
bytes
);
// 合并 IV + 密文(解密时需分离)
const output = new Uint8Array(iv.length + encrypted.byteLength);
output.set(iv, 0);
output.set(new Uint8Array(encrypted), iv.length);
return output; // 返回加密后的 Uint8Array
}
解密同理,只需用相同密钥 + 提取前 12 字节作为 IV 即可。
加密后怎么保存或传输
得到 Uint8Array 后,转成 Blob 就能下载或上传:
const encryptedBytes = await encryptFile(bytes);
const blob = new Blob([encryptedBytes], { type: "application/octet-stream" });
// 下载
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = file.name + ".enc";
a.click();
URL.revokeObjectURL(url); // ⚠️ 用完立即释放,防内存泄漏
上传也一样:fetch("/upload", { method: "POST", body: blob })。
小文件 vs 大文件的处理差异
- 小文件(:直接
readAsArrayBuffer一次性加载,简单高效。 -
大文件(>50MB):
- 用
file.slice()分片(如每片 4MB),逐片加密; - 或用
ReadableStream+tee()流式读取,边读边加密,内存占用可控; - 避免
JSON.stringify()或atob/btoa处理二进制——它们只适合 Base64 场景,且易丢数据。
- 用
不复杂但容易忽略
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











