应该将哪些Firebase存储参考保存到RTDB / Firestore?

时间:2019-10-01 23:12:03

标签: firebase firebase-storage

我正在尝试确定在诸如Realtime Database或Cloud Firestore之类的直接读取数据库中引用Firebase Storage(Google云存储)文件的最佳方法。由于对该数据库的读取操作无法从可以发出令牌和缓存图像URL的后端中受益,因此我不清楚最有效的方法是存储这些引用。

我提出了一些选择,但没有一个是明确的赢家。

  1. 将类似于/images/foo.jpg的路径存储到数据库,并使用Storage Client SDK生成带有storage.bucket().getDownloadURL("/images/foo.jpg")的标记化路径。

    优点:安全且简单。

    缺点:要显示的每个图像的网络通话都会大大影响性能。

  2. 存储带有超长TTL的标记化路径,例如https://firebasestorage.googleapis.com/v0/b/storage-bucket-823743.appspot.com/o/images%2Ffoo.jpg?alt=media&token=c6da1e33-f3ff-41e2-a6f0-bdb475a2f6d9

    优点:客户端上无需额外获取。

    缺点:长字符串存储在昂贵的RTDB中。如果该令牌被错误地吊销怎么办?现在数据库已损坏。

  3. 将类似于/images/foo.jpg的路径存储到数据库,并使用公共存储规则。重构为自定义静态网址,例如https://firebasestorage.googleapis.com/v0/b/storage-bucket-823743.appspot.com/o/images%2Ffoo.jpg?alt=media

    优点:使用微小的数据库,无需额外的客户端获取,无需公开访问,也不会丢失任何令牌。

    缺点:URL编码非常不稳定,存储设备可能会更改其URL格式,因此我们很不走运。

因此,这些是我提出的选项,并且可能还有更多选择。有关如何解决此问题的任何建议?这个问题是唯一的,因为Firebase数据库无法利用自定义服务器来处理令牌/缓存层来解决此问题。

1 个答案:

答案 0 :(得分:1)

没有唯一的“最佳方法”来存储这些路径。这完全取决于您的用例,首选项以及实现它的上下文。

我通常使用:

  1. 如果我需要访问要保护的文件,我会存储映像路径(例如在您的#1中),然后使用Firebase SDK来访问文件。
  2. 如果我不需要访问要保护的文件,则存储图像路径。这样,我可以根据路径轻松找到图像,并在非安全客户端中使用下载URL。

您提到的这些骗局根本不影响我。我建议您采用类似的方法,并在问题实际发生时报告。