为了获取上传到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时执行身份验证呢?
为什么我们需要调用异步函数而不是从一开始就知道唯一文件的URL ?
这是因为下载URL是在服务器上生成的。一旦数据成功上传到Firebase Storage,此URL就可用。这是一个异步操作,因为实际上将数据上传到服务器需要时间。根据连接速度和状态以及数据的大小,完成上传可能需要几百毫秒到几秒钟的时间。除此之外,URL还包含一个令牌,该令牌在文件上传到Cloud Storage时自动创建。这是一个随机令牌,这使得URL很难猜测。
这就是为什么你不能提前知道最终下载URL的原因。这与在Realtime Database中推送ID或在Firestore中生成文档ID不同,这两种操作都是在客户端上进行的。
我假设您正在使用Firebase Web。对于其他平台应该是一样的。
似乎它是异步的,因为它需要一个网络请求才能获得下载URL,正如你所说,它也执行身份验证(通过存储规则)。
然而,如果身份验证是必要的,为什么不为文件发出一个唯一的URL,然后在调用URL时执行身份验证呢?
我的假设:假设您调用1000个图像,当它们要渲染时,由于用户没有经过身份验证,因此失败。当然,这不是一个好的用户体验——最好在请求期间失败,这样你就可以向用户显示一些请求失败的反馈,可能是通过使用alert、modal或类似的东西。
引用:
- 查看
getDownloadUrl
的源代码。 - 以上功能的代码实现。
- Firebase Storage for Web.