Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase/Google云存储如何存储图像_Firebase_Google Cloud Firestore_Google Cloud Storage_Firebase Storage - Fatal编程技术网

Firebase/Google云存储如何存储图像

Firebase/Google云存储如何存储图像,firebase,google-cloud-firestore,google-cloud-storage,firebase-storage,Firebase,Google Cloud Firestore,Google Cloud Storage,Firebase Storage,我有一个Firestore,它有一个用户文档。当用户将配置文件图像上传到bucket时,我会在Cloud函数中调整其大小,然后保存较小的缩略图。现在我不确定接收下载URL的最佳实践是什么,有两种可能性: 在云函数中,获取已签名的URL并将其存储在用户文档或 使用.getDownloadUrl()方法在前端获取下载url 这两种解决方案的问题都是 1:URL真的很大,一个页面上有多个用户,这加起来比用户文档的实际其余部分更大 2:就速度而言,我不确定是否最好通过一个用户列表循环获取每个用户的缩略图

我有一个Firestore,它有一个用户文档。当用户将配置文件图像上传到bucket时,我会在Cloud函数中调整其大小,然后保存较小的缩略图。现在我不确定接收下载URL的最佳实践是什么,有两种可能性:

  • 在云函数中,获取已签名的URL并将其存储在用户文档或
  • 使用
    .getDownloadUrl()
    方法在前端获取下载url
  • 这两种解决方案的问题都是

    1:URL真的很大,一个页面上有多个用户,这加起来比用户文档的实际其余部分更大 2:就速度而言,我不确定是否最好通过一个用户列表循环获取每个用户的缩略图下载URL,但优点是我不必处理数据库中每次出现一个新的配置文件Pic URL的规范化问题

  • URL没有那么大。在尝试优化之前,首先收集一些明确的基准,这些基准表明URL的大小严重影响页面的性能。如果不需要,不要优化它。我从未听说过有人抱怨下载URL对性能有害

  • 您不需要遍历所有用户。您应该安排在调整大小时提供用户的UID,以便更新正确的用户。您可以将UID放在文件上载的路径中并对其进行解析,也可以在上载时将UID放在对象元数据中


  • 不过,这两种方法都是有效的。挑一个最适合你的。在后端生成它可能更容易出错。

    正如Doug Stevenson在回答中提到的,我还认为您正在尝试优化一些甚至不是性能或存储问题的东西。但是,如果您仍然想优化URL的大小,我有两个解决方案

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

    https://firebasestorage.googleapis.com/v0/b/project-id/o/images_folder%2vvTMvCsCRsckpR3R5Qg2s.jpg?alt=media&token=2277f575-8ff7-2211-8262-a28ef679d703
    
    因此,第一个解决方案是使用类似的服务缩短链接。还有其他例子,但我想你明白了。因此,对于上面的URL,在缩短后,将如下所示:

    http://tiny.cc/2r4ucz

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

    其中包括项目的名称和存储图像的文件夹的名称。它还包含图像的名称,在我的例子中,它是由Firestore生成的id,并且定义为唯一的。最后一部分是令牌id:

    2277f575-8ff7-2211-8262-a28ef679d703
    
    因此,第二种解决方案是只在数据库中存储图像和令牌的id,然后重建整个URL客户端。因此,在上面的示例中,您应该存储的唯一内容是:

    Firestore-root
      |
      --- users (collection)
           |
           --- uid (document)
                |
                --- id: vvTMvCsCRsckpR3R5Qg2s
                |
                --- token: 2277f575-8ff7-2211-8262-a28ef679d703
                |
                --- //Other user details
    
    如果您的用户始终只有一张图片,那么您可以使用来自身份验证过程的
    uid
    来代替该随机id:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    

    嘿,问题是如果我在服务器上获得下载URL,那么我必须使用云存储SDK,它只能给我一个签名URL,我认为没有令牌,只是一个无限长的URL。在这种情况下,你可以缩短URL,一个API,如我的回答中提到的,对吗?你试过了吗?长度的问题是,如果我在每条消息上聊天并存储头像,图像链接的字节数比内容字段本身的字节数还要多,这有点奇怪。这样,与一个小链接相比,我需要100%以上的带宽,但我认为没有办法创建像firebase storage frotnend那样的URL,使用admin sdk?在使用后端sdk时生成签名URL。
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();