Firebase / Google Cloud Storage如何存储图像

时间:2019-09-16 22:12:59

标签: firebase google-cloud-firestore google-cloud-storage firebase-storage

我有一个带有用户文档的Firestore。当用户将个人资料图片上传到存储桶时,我会在Cloud Function中调整其大小,然后保存较小的缩略图。现在,我不确定最好的方法是接收它的下载URL,有两种可能:

  1. 在Cloud Function中获取一个签名URL,并将其存储在“用户文档”中或
  2. 使用.getDownloadUrl()方法在前端获取下载URL。

我对这两种解决方案都遇到的问题是

1:URL确实很大,一个页面上有多个用户,这比用户文档的其余部分实际多 2:就速度而言,我不确定是否最好循环浏览用户列表以获取每个用户的缩略图下载URL,但是优点是我不必处理数据库中每次出现的新Profile Pic URL标准化问题

2 个答案:

答案 0 :(得分:0)

  1. URL没那么大。在尝试进行优化之前,请先收集一些明确的基准,这些基准表明URL的大小严重影响了页面的性能。如果不需要,请不要对其进行优化。我从未听说有人抱怨下载URL不利于性能。

  2. 您不需要遍历所有用户。您应该安排在调整大小时使用户的UID可用,以便您可以更新正确的用户。您可以将UID放在文件上传的路径中并解析出来,也可以在上传时将UID放在对象元数据中。

但这两种方法都是有效的。选择最适合您的那个。在后端生成它可能更容易出错。

答案 1 :(得分:0)

正如道格·史蒂文森(Doug Stevenson)在回答中提到的那样,我还认为您正在尝试优化甚至不是性能或存储问题的东西。但是,如果您仍然想优化URL的大小,那么我有两种解决方案。

我们已经知道,图片的URL类似于以下内容:

<com.google.android.material.navigation.NavigationView
...
...
/>

因此,第一种解决方案是使用tiny.cc之类的服务来缩短链接。还有其他示例,但我认为您可以理解。因此,在上述网址的情况下,将其缩短后,将如下所示:

  

http:// tiny.cc / 2r4ucz

第二种解决方案要求在数据库中保存两件事。这不是缩短链接,而是存储更少的数据。如您所见,上面的URL是从“ BASE_URL”组合而成的:

num = """
123
456
""".replace('\n', '')

print(repr(num)) # -> '123456'

其中包括项目的名称和存储图像的文件夹的名称。它还包含图像的名称,在我的情况下,该名称是由Firestore生成的ID,并且根据定义是唯一的。最后一部分是令牌ID:

https://firebasestorage.googleapis.com/v0/b/project-id/o/images_folder%2vvTMvCsCRsckpR3R5Qg2s.jpg?alt=media&token=2277f575-8ff7-2211-8262-a28ef679d703

因此,第二种解决方案是仅将图像的ID和令牌存储在数据库中,然后重建整个URL客户端。因此,在上面的示例中,您应该存储的唯一内容是:

https://firebasestorage.googleapis.com/v0/b/project-id/o/images_folder

如果您的用户始终只有一张图片,那么您可以使用来自身份验证过程的2277f575-8ff7-2211-8262-a28ef679d703 代替该随机ID:

Firestore-root
  |
  --- users (collection)
       |
       --- uid (document)
            |
            --- id: vvTMvCsCRsckpR3R5Qg2s
            |
            --- token: 2277f575-8ff7-2211-8262-a28ef679d703
            |
            --- //Other user details