为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL
Posted
技术标签:
【中文标题】为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL【英文标题】:Why asynchronous function "getDownloadURL" are used to get file URLs in Firebase Storage为什么使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL 【发布时间】:2021-12-15 09:06:47 【问题描述】:为了获取上传到 Cloud Storage 的文件的 URL,我们必须编写如下代码。
import getStorage, ref from 'firebase/storage'
const storage = ref(getStorage(firebaseApp))
const url = await getDownloadURL(ref(storage, 'images/sample.jpg'))
为什么我们需要调用异步函数而不是一开始就知道唯一文件的 URL? 我猜当您调用“getDownloadURL”时身份验证已完成。 但是,如果需要进行身份验证,为什么不为文件发布一个唯一的 URL,然后在调用该 URL 时进行身份验证?
【问题讨论】:
【参考方案1】:为什么我们需要调用异步函数而不是一开始就知道唯一文件的 URL?
这是因为下载地址是在服务器上生成的。数据成功上传到 Firebase 存储后,此 URL 即可使用。这是一个异步操作,因为将数据实际上传到服务器需要时间。根据连接速度和状态以及数据的大小,完成上传可能需要几百毫秒到几秒钟的时间。除此之外,该 URL 还包含一个令牌,该令牌会在文件上传到 Cloud Storage 时自动创建。它是一个随机令牌,这使得 URL 难以猜测。
这就是您无法提前知道最终下载 URL 的原因。这与在实时数据库中推送 ID 或在 Firestore 中生成文档 ID 不同,两者都在客户端上进行。
【讨论】:
感谢您的清晰解释,我的问题得到了解答。谢谢。【参考方案2】:我假设您使用的是 Firebase 网页版。其他平台应该也是一样的。
似乎它是异步的,因为它需要网络请求才能获取下载 URL,并且正如您所说,它也执行身份验证(通过存储规则)。
但是,如果需要进行身份验证,为什么不为文件发布一个唯一的 URL,然后在调用该 URL 时执行身份验证?
我的假设:假设您调用 1000 张图像,当它们要渲染时,由于用户未通过身份验证,它会失败。当然,这不是一个好的用户体验 - 最好在请求期间失败,这样您就可以向用户显示请求失败的一些反馈,可能通过使用警报、模式或类似的方式。
参考资料:
Check out the source code ofgetDownloadUrl
here。
The implementation of the above function in code。
Firebase Storage for Web。
【讨论】:
以上是关于为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 存储子引用 getDownloadURL 返回“childPath.split 不是函数”