Firebase 如何通过firestore中的add()将图像上载到自动生成的文档

Firebase 如何通过firestore中的add()将图像上载到自动生成的文档,firebase,google-cloud-firestore,firebase-storage,Firebase,Google Cloud Firestore,Firebase Storage,我正在创建一个动态页面板 此页面上的url是通过firestore add()创建的 我想允许用户在这个公告板上创建帖子时上传图片 有没有办法将图像放入firestore字段 如果没有,我是否应该让他们将图像上传到存储器? 如果是,我可以从通过add()创建的页面加载图像吗 因为您没有指定目标语言,所以我假设您使用的是JavaScript Web SDK。在每个SDK中,add(data)是doc().set(data)的语法糖。因此,要生成可在文件上载中使用的表单ID,我们可以使用: cons

我正在创建一个动态页面板

此页面上的url是通过firestore add()创建的

我想允许用户在这个公告板上创建帖子时上传图片

有没有办法将图像放入firestore字段

如果没有,我是否应该让他们将图像上传到存储器? 如果是,我可以从通过add()创建的页面加载图像吗


因为您没有指定目标语言,所以我假设您使用的是JavaScript Web SDK。在每个SDK中,
add(data)
doc().set(data)
的语法糖。因此,要生成可在文件上载中使用的表单ID,我们可以使用:

const formRef=firebase.firestore().collection(“forms”).doc();
最后,在数据库中存储图像时,有两种选择

不推荐:将资源嵌入云Firestore文档中 在文档中存储二进制文件的最简单方法之一是使用二进制文件。这些URL获取二进制数据,将其编码为Base64,添加一些有关存储数据的元数据,然后生成如下所示的字符串:

//单个#FFFFFF像素的PNG图像的数据URL
“数据:image/png;base64,IVBORW0KGGOAAAANSUHEUGAAAAAAACQD1PEAAAAAAAAAAXnsr0IARS4C6QAAAQUANQU1BAACXJWV8YQUAAAAJCEHZCWAAADSMAA7DACDVGQAAAMSURBVBHXY/j//z8ABf4C/QC1GYQAAAASUV5CYII=”
然后,这些数据URL可以存储在文档(例如
/forms/{formId}
)或其子集合(例如
/forms/{formId}/attachments/{attachmentId}
)中。通过这种方式存储图像,由于Base64编码,文件大小会膨胀大约25%或更多

使用此方法,您可以使用控制对图像的访问,但还需要实现从数据库获取图像并将其插入网页的逻辑

要将添加到表单中的图像转换为数据URL,请参阅文档以获取详细信息。您还可以将web画布转换为数据URL,如下所示

函数readFileAsDataURL(文件){ 返回新承诺((解决、拒绝)=>{ const reader=new FileReader(); addEventListener(“加载”,函数(){resolve(this.result)},false); addEventListener(“error”,函数(){resolve(this.error)},false); reader.readAsDataURL(文件); }); } 子表单上的异步函数(e){ const user=firebase.auth().currentUser; 如果(!用户){ setErrorMessage(“您必须登录!”); 返回false; } const uid=user.uid; const files=document.querySelector('input[type=file]')。files; const dataURLs=文件 ?等待承诺.all([].map.call(文件,readFileAsDataURL)) : []; //准备数据库资料 const db=firebase.firestore(); const batch=db.batch(); //创建表单引用 const formRef=db.collection(“forms”).doc(); //组装并排队上载每个附件 const attachmentsColRef=formRef.collection(“附件”); const attachmentIds=dataURLs.map((url,i)=>{ 常量文件=文件[i]; const attachmentRef=attachmentsColRef.doc(); 常量附件数据={ id:attachmentRef.id,//可选 lastModified:firebase.firestore.Timestamp.fromMillis(file.lastModified), name:file.name, src:url, 类型:file.type } batch.set(attachmentRef、attachmentData); 返回attachmentRef.id; } //汇编表单数据 常量formData={ 附件:附件, 内容:“这是我的第一篇帖子”, createdAt:firebase.firestore.FieldValue.serverTimestamp(), id:formRef.id,//可选 姓名:“约翰”, 标题:“你好,世界!我是约翰”, uid, updatedAt:firebase.firestore.FieldValue.serverTimestamp(), 浏览次数:0 } //表单数据的队列上载 批量设置(formRef、formData); //上传 返回batch.commit() .然后(()=>{ log(`Successfully created Form#${formRef.id}!`); 返回true; }) .catch((错误)=>{ setErrorMessage(“未能提交表单数据!”); 错误(`未能创建表单#${formRef.id}!`,错误); 返回false; }); } 建议:将文件存储在云存储(或其他合适的二进制数据存储)中 本部分将重点介绍Google云存储,但也可应用于其他基于应用程序的文件存储服务(如Amazon Elastic文件系统、Amazon S3 Bucket、DigitalOcean Spaces等)和以消费者为中心的文件存储服务(如Google Drive、OneDrive、Dropbox、WetTransfer等)

与CloudFireStore类似,您可以在这个“二进制对象数据库”中存储图像但是,与Cloud Firestore不同的是,这种存储方法针对以多种不同形式存储二进制数据进行了优化,并提供了许多针对文件处理的重点功能,如限制上载文件、恢复上载、缓存浏览器信息、保留策略(例如,删除所有超过1年的文件)和文件版本控制(如果您想使用它)

存储在云存储中的文件可以通过云存储和Firebase SDK访问,也可以通过URL访问(如果文件是私有文件,则在访问URL时需要提供访问令牌)

这些URL通常采用以下形式:

//谷歌云存储中的公共文件
"https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME"
//Firebase云存储中带有访问令牌的私有文件
"https://firebasestorage.googleapis.com/v0/b/PROJECT_ID.appspot.com/o/OBJECT_NAME.png?alt=media&token=ACCESS_TOKEN"
SubmitForm(e)上的异步函数{ const user=firebase.auth().currentUser; 如果(!用户){ setErrorMessage(“您必须登录!”); 返回false; } const uid=user.uid; const files=document.querySelector('input[type=file]')。files; //准备数据库资料 const db=firebase.firestore(); const batch=db。