通过云功能将文件从前端上传到firebase存储



我正在努力实现以下目标:

  1. 用户在网站上选择文件
  2. 用户调用Firebase Cloud函数并将文件传递到该函数
  3. 云功能将文件上传到存储器

到目前为止,我可以完成以上所有操作,但是,当我尝试访问存储中的上述文件时,会下载一个没有扩展名的文件。最初的文件是pdf,但我仍然无法用pdf查看器打开它。看起来我在储存一些东西,尽管我不确定是什么。

以下是我的前端代码如何工作的示例:

const getBase64 = file => new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
var document_send = document.getElementById('myFile')
var send_button = document.getElementById('send_button')
send_button.addEventListener('click', async () => {
var sendDocument = firebase.functions().httpsCallable('sendDocument')
try {
await sendDocument({
docu: await getBase64(document_send.files[0])
})
} catch (error) {
console.log(error.message);
}
})

以下是我的云功能如何工作的示例:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
exports.sendDocument = functions.https
.onCall((data, context) => {
return admin.storage().bucket()
.file("randomLocationName")
//.file("randomLocationName"+".pdf") - tried this also
.save(data.docu);
})
.catch((error) => {
console.log(error.message);
return error;
});
});

我没有收到错误消息,因为函数运行时没有出现错误。

save()函数似乎将stringBuffer作为第一个参数。

> save(data: string | Buffer, options?: SaveOptions)

当直接传递base64字符串而不是Buffer时,就会出现问题。尝试重构如下所示的代码:

return admin.storage().bucket()
.file("randomLocationName" + ".pdf") // <-- file extension required
.save(Buffer.from(data.docu, "base64"));

云功能的最大请求大小为10 MB,因此您无法以这种方式上传大型图像。您可以使用Firebase客户端SDK直接上传文件,使用安全规则限制访问,并在需要处理文件和更新数据库时使用Cloud Storage Triggers for Cloud Function。或者,如果您在没有Firebase的情况下使用GCS,请使用签名URL上传文件。

最新更新