使用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
相关产品推荐
相关产品推荐

