Android:从FireBase存储API

时间:2017-11-13 09:57:54

标签: android firebase google-cloud-storage firebase-cloud-messaging firebase-storage

我有一个图像列表,其中包含直接上传到Fire-base控制台的单独文件夹。我想将这些图像下载到应用程序中,以使用存储API在网格中显示它。

我调查了这个https://firebase.google.com/docs/storage/android/download-files 但这仅适用于下载单个图像,必须为其指定名称。

基本上我想获得存储在控制台中单独文件夹中的多个类别的所有图像。

2 个答案:

答案 0 :(得分:2)

要从Firebase存储下载图像,首先需要拥有图像的相应网址。要下载图像,需要更多步骤:

  
      
  1. 将图像上传到Firebase存储。
  2.   
  3. 上传时将相应的网址保存到Firebase数据库。
  4.   
  5. 在已保存图像的文件夹上附加侦听器。
  6.   
  7. 显示图像。
  8.   

我们假设您的Firebase存储结构如下所示:

Storage-root
   |
   --- Photos
         |
         --- FolderNo1
         |      |
         |      --- image1.jpg
         |      |
         |      --- image2.jpg
         |
         --- FolderNo2
                |
                --- image3.jpg
                |
                --- image3.jpg

存储图片网址的Firebase数据库的相应数据库结构应如下所示:

Firebase-root
   |
   --- Photos
         |
         --- FolderNo1
         |      |
         |      --- imageName1: imageUrl1
         |      |
         |      --- imageName2: imageUrl2
         |
         --- FolderNo2
                |
                --- imageName3: imageUrl3
                |
                --- imageName4: imageUrl4

Firebase数据库中的文件夹名称可以是简单名称(但要确保在上传时检查名称的唯一性),或者可以是随机唯一ID,在这种情况下,我会使用push()方法重新命名。< / p>

如果您要通过Firebase控制台保存图片,则无法获取图片网址,这就是您应该以编程方式执行此操作的原因。

Firestore文档显示了如何只下载单个图像,因为即使您下载单个图像或更多图像,代码也几乎相同。

如果您想从单个文件夹中获取所有网址,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference folderRef = rootRef.child("Photos").child("FolderNo1");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String imageName = ds.getKey();
            String imageUrl = ds.getValue(String.class);
            list.add(imageUrl);
        }
        Log.d("TAG", list);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
folderRef.addListenerForSingleValueEvent(eventListener);

如果您想获取所有文件夹中的所有网址,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference photosRef = rootRef.child("Photos");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String imageName = ds.getKey();
            String imageUrl = ds.getValue(String.class);
            list.add(imageUrl);
        }
        Log.d("TAG", list);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
photosRef.addListenerForSingleValueEvent(eventListener);

在这两种情况下,正如您可能看到的那样,您会获得List个网址。有了这个列表,您现在可以根据Firebase Storage Office Documentation下载所需的图像,但不是使用那里提到的一个网址,而是需要使用List个网址。

答案 1 :(得分:0)

您需要在firebase数据库中上传图像时保存实时数据库中的路径和图像名称,而不是获取所有图像

显示在下图中

<code>enter image description here</code>