我正在使用Express、Node和Google Drive API。我试图用一个PDF文件的blob响应API调用到我的端点。但是,当我从Drive API中获取文件时,我不想保存它,基本上我只是想将它存储在一个变量中,将其转换为base64,然后将其发送给我的API消费者。
快速概述正在发生的事情。我卡在了步骤3-4。 1. 消费者使用包含支付信息的有效载荷调用我的API端点 2. 我从Template创建一个新的Document,并使用payload使用Docs API来填充文档。3. 我将文档导出为PDF。4. 我向我的API消费者发送一个响应,其中包含步骤3中的Document的blob。
我如何才能实现这一点?
为什么我想实现这个目标?基本上,我试图避免创造额外的工作来下载文件并将其存储在某个地方,因为这样我就需要另一个连接到某个东西。如果我不能避免这种情况,当我想尝试在GCP上使用Buckets来处理这个问题。所以那里的建议也会很有帮助。
下面是我的代码概述。
// this works
const driveAPI = google.drive({version:"v3", auth: client});
const fileId = await createDocFromTemplate();
const doc = updateDoc( fileId, req.body );
// now it gets tricky
const PDF_FILE = exportDocAsPdf(doc); // how can I temporarily store pdf to a variable?
const PDF_AS_BASE = transformPdfToBase64(PDF_FILE); // how can I convert pdf to base64?
// this is what I want to send back to the API consumer
res.send({
id: fileId,
fileAsPdf : PDF_AS_BASE
})
我相信你的目标如下。
对于这个问题,这个答案如何?
不幸的是,我不能看到你的脚本 updateDoc( fileId, req.body )
, exportDocAsPdf(doc)
和 transformPdfToBase64(PDF_FILE)
. 所以在这个答案中,我想提出一个通过输入Google文档的文件ID来返回PDF格式的base64数据的示例脚本。
本例中,输入和输出值分别是Google Document的文件ID和PDF格式的base64数据。
async function exportFile(drive, documentId) {
const res = await drive.files.export(
{
fileId: documentId,
mimeType: "application/pdf",
},
{ responseType: "arraybuffer" }
);
return Buffer.from(res.data).toString("base64");
}
const documentId = "###"; // Please set the Google Document ID
const driveAPI = google.drive({ version: "v3", auth: client });
const base64 = await exportFile(driveAPI, documentId).catch((err) => {
if (err) console.log(err);
});
console.log(base64);
Buffer.from(res.data).toString("base64")
.