【问题标题】:Retrieve multiple photos under a node from Firebase Storage从 Firebase 存储中检索节点下的多张照片
【发布时间】:2016-10-16 21:08:30
【问题描述】:

我有一个 CollectionView,我正在使用 Firebase 存储中的图像来填充它。我将图像存储在“userId”节点下。我想批量检查节点下可用的文件是否存在,以便将它们存储在数组中。

我尝试分别检索每个网址,但是,我认为这是一种非常错误的方法。但是,我不知道如何以最有效的方式进行操作以及将collectionView.reload() 放在哪里。这就是我所做的:

let storage = FIRStorage.storage()
let firstImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("profile.jpg")

firstImageRef.downloadURLWithCompletion { (URL, error) -> Void in
   if (error != nil) {
       print(error)
   } else {
       if let url = URL {
         self.databaseImagesOrder.append(url)
       }
   }
}

let secondImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("second_pic.jpg")
secondImageRef.downloadURLWithCompletion { (URL, error) -> Void in
   if (error != nil) {
      print(error)
   } else {
      if let url = URL {
        self.databaseImagesOrder.append(url)
      }
   }
 }

 // etc.. 

 collectionView.reloadData()

另外,将图像作为 NSData 获取比先获取 url 然后获取图像更好吗?如果是这样,我如何从 Firebase 存储中批量检索图像?

【问题讨论】:

  • 有没有办法可以完成这三个?正确的做法是什么?如果我单独打电话,我不知道在哪里打电话给collectionView.reload()
  • 听起来您希望一次性加载文件夹中的所有文件。这不是 Firebase 存储中支持的操作。我也怀疑它是否会有很大帮助,因为对于大多数文件来说,文件的大小远远超过所需的额外往返。

标签: swift firebase firebase-storage


【解决方案1】:

目前没有批量或批量上传/下载到 Firebase Storage 或从 Firebase Storage 上传/下载——我认为这里有太多问题:我们是否会压缩文件并以这种方式存储它们,我们是否会返回一个压缩包,等等。会我们只返回一组下载 URL 或适当的数据?

对于列出和下载多个文件的问题,我们的解决方案是单独上传它们并将 URL 存储在另一个数据库(例如 Firebase 实时数据库)中,然后您可以同步并使用它来单独下载每个文件(或者您存储下载文件并使用SDWebImage 之类的工具下载或缓存相应的 URL)。

请参阅 https://www.youtube.com/watch?v=xAsvwy1-oxE&feature=youtu.be 了解我们如何做到这一点的示例。

【讨论】:

  • 有时候getDownloadUrl()返回的url是无效的,所以用Realtime database来做这个是没有用的。当您尝试使用 uploadSessionUri 恢复上传时,文件可以完全恢复,但 onSuccess() 返回的 url 无效。但是,该文件在控制台中完全没问题,但 url 不是。遇到这种情况该怎么办?
  • @CopsOnRoad URL 应该始终有效(除非您在控制台中将其无效)。如果您有我们的重现,请告知支持人员 (firebase.google.com/support/contact/bugs-features),以便我们查看是否存在错误。
  • 我没有从控制台做任何事情,在我的 logcat 中我看到onSuccess() 被调用,然后我从那里记录了getDownloadUrl()。当我复制该链接并粘贴到浏览器中时,它不起作用。但是,当我对新上传的文件执行相同的步骤时,它会重新调整工作 url。所以,我认为有一个错误。我将提交一份关于你写的链接的报告。希望从您那里得到一些解决方案。
【解决方案2】:

我不知道这是否是您想要的,但我想出了一个简单的方法将多个文件上传到 firebase 存储并获取它们各自的下载 url。

  private void uploadPosts(final ArrayList<String> mediaUris) {

        StorageReference fileRef = storageRef.child("users").child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).child("posts").child(key).child("file_" + index);
        File mediaFile = new File(mediaUris.get(index));


        final UploadTask uploadTask = fileRef.putFile(Uri.fromFile(mediaFile));
        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
                fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {

                        Log.d(TAG,"URL = "+uri); //url of each file

                        if(index < mediaUris.size()) {
                            index++;
                            uploadPosts(mediaUris); //Recursion
                        }

                    }
                });
            }

        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(getApplicationContext(), "Upload failed", Toast.LENGTH_SHORT).show();
                Log.e(TAG,"Failed "+e.getCause());
            }

        });

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多