我正在使用Firebase存储,在文档中,我看到方法getDownloadURL()
,但它所做的只是在URL的末尾附加一些令牌?
如果我的图片是公开的,我可以简单地使用模板文字自己创建下载链接并将其存储在Firestore中而不需要令牌吗?:
所以不用这个:
getDownloadURL(userUploadRef).then(async (downloadUrl) => {
const imageUrl = downloadUrl;
// store it to firestore
只需这样做:
const imageUrl = `https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/routinePhotos%2F${res.data.docRefId}?alt=media`;
const thumbnailUrl = `https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/routinePhotos%2F${res.data.docRefId}_640x360?alt=media`;
// store links in firestore
因为这些链接是基于Firestore中的文档Id,即使我更改了存储中的实际图片,我也不必更新Firestore文档中的链接,因为这些链接总是指向相同的位置。
- 我可以自己创建链接吗?
- 如果我可以在没有它的情况下访问该文件,那么在链接末尾需要额外的令牌URL是什么?
getDownloadUrl()?
的目的是什么?
- 我可以自己创建链接吗?
不,因为这个令牌是在服务器上生成的。
- getDownloadUrl()的目的是什么?
是获取上传文件的下载URL,包括令牌。
- 如果我可以在没有它的情况下访问该文件,那么在链接末尾需要额外的令牌URL是什么?
添加在URL末尾的令牌作为一种安全措施,将访问限制为只有那些知道令牌的人。没有它,您就无法访问该文件。您将得到一个permission denied error:
{
"error": {
"code": 403,
"message": "Permission denied."
}
}
编辑:
如果你想在没有令牌的情况下访问文件,那么你应该这样设置规则:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read; //👈
allow write: if request.auth != null;
}
}
}