【问题标题】:Firebase storage url, new file keep same access tokenFirebase 存储 url,新文件保持相同的访问令牌
【发布时间】:2021-01-13 15:16:39
【问题描述】:

重复:Firebase storage URL keeps changing with new token

当用户上传个人资料图片时,我将其存储在 firebase 存储中,文件名作为 uid。 假设用户随后发布了 100 个帖子 + 500 个 cmets,然后更新了他们的个人资料图片。

目前我有一个触发器,它会更新所有帖子和评论文档中的个人资料图片网址。我必须这样做的原因是,当图像在存储中更改时,访问令牌会更改,这是 url 的一部分,因此旧 url 不再有效。

我想要做的不是更改访问令牌。如果我能做到这一点,我就可以避免大量更新,这会大大增加我的 Firestore 写入量。

有没有办法做到这一点?还是替代品?

【问题讨论】:

标签: firebase google-cloud-storage


【解决方案1】:

这里只有两个选项:

  1. 您只将个人资料图片 URL 存储一次,可能在用户的个人资料文档中,并在每次需要时查找它。作为回报,您只需编写一次。
  2. 您存储每个帖子的个人资料图片 URL,在这种情况下,您只需加载帖子文档而不是每个帖子的个人资料 URL。作为回报,您必须在每个帖子文档中编写个人资料 URL,并进行更新。

对于较小的网络,前者更常见,因为您更有可能看到来自同一用户的多个帖子,因此您可以分摊多个帖子的额外查找成本。

用户网络越大,第二种方法就越有趣,因为您更关心读取性能和简单性,而不是您现在关注的写入。

最后,这里没有唯一的正确答案。您必须自己决定希望您的应用拥有什么样的性能和成本配置文件。

【讨论】:

  • 如果我使用第 3 方服务来存储允许静态 URL 的用户个人资料图像,即使图像发生更改,这也将提供第三种选择,无需额外读取或写入。例如someservice/myaccount/uid.jpg
【解决方案2】:

@Prodigy 在这里提供的答案:https://stackoverflow.com/a/64129850/10222449 我试过了,效果很好。 这将节省数百万次写入。

var storage = firebase.storage();
    var pathReference = storage.ref('users/' + userId + '/avatar.jpg');
    pathReference.getDownloadURL().then(function (url) {
        $("#large-avatar").attr('src', url);
    }).catch(function (error) {
        // Handle any errors
    });

【讨论】:

  • 当他们更新个人资料图片时,您如何处理媒体令牌?
  • 我相信,当图片更新时,我只是删除了当前的一张,然后经历与上传新的同名的相同的过程。
  • 是的,我也尝试过,但我似乎无法避免那个标记。我已将存储桶设置为公共,最初将图像设置为 {userid}.png 但现在尝试了 ../{userid}/avatar.png 然后还尝试首先删除原始图像并上传新图像。仍然没有,我需要新的有令牌或什么都没有。我已就此向 Firebase 发送反馈。
  • 我刚刚查看了我的代码,虽然它在我测试时确实有效,但我还没有使用它。我打算在将来添加它。上传更新后的图像时是否会生成新令牌? pathReference.getDownloadURL() 应该返回带有令牌的完整 url。
  • 对我来说,这与设备、cdn 或其他地方的某种缓存有关。我最终不得不解决这个问题是在 url (?dummy=asdasd) 上应用一个虚拟参数。这并不理想,因为它适用于我知道个人资料的地方......但当我带回用户列表时......等等......
猜你喜欢
  • 2018-02-19
  • 2021-07-16
  • 2021-09-13
  • 2013-07-11
  • 2019-04-01
  • 2021-07-08
  • 2018-02-16
  • 2020-09-16
  • 2020-04-13
相关资源
最近更新 更多