从Firebase存储中检索节点下的多张照片

时间:2016-06-15 16:17:21

标签: swift firebase firebase-storage

我有一个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存储中批量检索图像?

2 个答案:

答案 0 :(得分:2)

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

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

有关我们如何执行此操作的示例,请参阅https://gist.github.com/mcdonamp/cc45567cd95ba2a62017cb21e891effdhttps://www.youtube.com/watch?v=xAsvwy1-oxE&feature=youtu.be

答案 1 :(得分:1)

我不知道这是否是您想要的,但是我想出了一种简单的方法,可以将多个文件上传到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());
            }

        });

    }