You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firebase存储PDF?Base64编码文件过大的纯JS压缩方案

问题解答

1. Firebase中存储PDF文件的方案

Firebase完全支持存储PDF文件,但不适合将Base64编码的PDF直接存入Firestore文档——因为Firestore单文档最大限制为1MB,这正是你遇到错误的原因:

Uncaught (in promise) FirebaseError: Document 'projects/jeel-al-ebdaa/databases/(default)/documents/Teachers/testteacher' cannot be written because its size (1,377,477 bytes) exceeds the maximum allowed size of 1,048,576 bytes.

正确的做法是:

  • 将PDF文件(或解码后的Blob)直接上传到Firebase Storage,它支持最大5TB的文件存储,完全满足PDF的大小需求。
  • 上传完成后,将Storage返回的文件下载URL或存储路径存入Firestore文档,这样既规避了文档大小限制,也方便后续读取和访问PDF。

2. 纯Vanilla JS下的Base64文本压缩方法

如果确实需要对Base64编码的PDF内容进行压缩(比如临时处理场景),可以利用浏览器原生的CompressionStream API实现gzip/deflate压缩,步骤如下:

压缩步骤代码示例

// 将Base64字符串解码为ArrayBuffer
function base64ToArrayBuffer(base64) {
  // 移除可能存在的data URI前缀
  const cleanBase64 = base64.replace(/^data:application\/pdf;base64,/, '');
  const binaryString = atob(cleanBase64);
  const len = binaryString.length;
  const bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  return bytes.buffer;
}

// 将ArrayBuffer编码为Base64字符串
function arrayBufferToBase64(buffer) {
  const bytes = new Uint8Array(buffer);
  let binary = '';
  const len = bytes.byteLength;
  for (let i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return btoa(binary);
}

// 压缩Base64格式的PDF内容
async function compressBase64Pdf(base64Pdf) {
  try {
    const arrayBuffer = base64ToArrayBuffer(base64Pdf);
    // 创建gzip压缩流(也可替换为'deflate'格式)
    const compressionStream = new CompressionStream('gzip');
    // 将ArrayBuffer转为可读取流
    const readableStream = new Blob([arrayBuffer]).stream();
    // 执行压缩
    const compressedStream = readableStream.pipeThrough(compressionStream);
    // 将压缩后的流转为ArrayBuffer
    const compressedBuffer = await new Response(compressedStream).arrayBuffer();
    // 转回Base64字符串
    return arrayBufferToBase64(compressedBuffer);
  } catch (error) {
    console.error('压缩失败:', error);
    throw error;
  }
}

// 调用示例
// const yourBase64Pdf = "data:application/pdf;base64,...";
// const compressedBase64 = await compressBase64Pdf(yourBase64Pdf);

注意事项

  • CompressionStream是现代浏览器的原生API,需确认目标环境支持(Chrome 80+、Firefox 113+、Edge 80+)。
  • 压缩后的Base64字符串大小会显著减小,但如果压缩后仍超过1MB,还是建议优先使用Firebase Storage存储原文件,而非强行存入Firestore文档。

内容的提问来源于stack exchange,提问作者Mulham Alamry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:57:16