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

使用Firebase Admin云函数存储Base64 PDF至Firebase Storage报错

解决Firebase Admin SDK保存Base64 PDF到Storage时「文件对象不存在」的问题

在TypeScript云函数中使用Firebase Admin SDK将Base64编码的PDF保存到Firebase Storage时,明明是创建新文件却收到「文件对象不存在」的错误,已确认存储服务启用且尝试创建了invoices文件夹。

原代码

const base64Pdf = ...;
const file = admin.storage().bucket().file("invoices/642d5000-851f-449d-8c4a-ec49aafabf80.pdf");
const pdfBuffer = Buffer.from(base64Pdf, "base64");
try {
  await file.setMetadata({
    contentType: "application/pdf",
  });
  await file.save(pdfBuffer);
  const signedUrls = await file.getSignedUrl({
    action: "read",
    expires: "12-31-2500",
  });
  ...
} catch (e) {
  functions.logger.error(`[checkDocuments] Error saving PDF: ${e}`);
}

报错信息

Error saving PDF: Error: No such object:
myproject.appspot.com/invoices/642d5000-851f-449d-8c4a-ec49aafabf80.pdf

问题原因

错误出在调用顺序上:setMetadata方法是针对已存在的文件进行操作的,而此时文件还未通过save创建,所以SDK会提示找不到文件对象。

修复方案

方案一(推荐:高效一次性操作)

将元数据参数直接传入save方法,在创建文件的同时完成元数据设置:

const base64Pdf = ...;
const file = admin.storage().bucket().file("invoices/642d5000-851f-449d-8c4a-ec49aafabf80.pdf");
const pdfBuffer = Buffer.from(base64Pdf, "base64");
try {
  // 保存文件时附带元数据
  await file.save(pdfBuffer, {
    metadata: {
      contentType: "application/pdf",
    },
  });
  const signedUrls = await file.getSignedUrl({
    action: "read",
    expires: "12-31-2500",
  });
  // 后续业务逻辑
} catch (e) {
  functions.logger.error(`[checkDocuments] Error saving PDF: ${e}`);
}

方案二(先创建再设置元数据)

先调用save创建文件,再执行setMetadata:

const base64Pdf = ...;
const file = admin.storage().bucket().file("invoices/642d5000-851f-449d-8c4a-ec49aafabf80.pdf");
const pdfBuffer = Buffer.from(base64Pdf, "base64");
try {
  await file.save(pdfBuffer);
  // 文件创建完成后再设置元数据
  await file.setMetadata({
    contentType: "application/pdf",
  });
  const signedUrls = await file.getSignedUrl({
    action: "read",
    expires: "12-31-2500",
  });
  // 后续业务逻辑
} catch (e) {
  functions.logger.error(`[checkDocuments] Error saving PDF: ${e}`);
}

额外说明

Firebase Storage中的文件夹是虚拟目录,不需要提前手动创建。只要文件路径包含文件夹名称,保存文件时会自动生成对应的虚拟目录结构,因此之前手动创建invoices文件夹的操作可以省略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:40:17