Как получить список всех файлов в облачном хранилище в приложении Firebase?

104

Я работаю над загрузкой изображений, все работает отлично, но у меня есть 100 изображений, и я хотел бы показать их все у себя View, так как я получаю полный список изображений в папке, я не могу найти для этого API работай.

Луис Руис Фигероа
источник
Можете ли вы опубликовать решение с полным кодом?
ISS

Ответы:

92

Начиная с Firebase SDK для JavaScript версии 6.1 , iOS 6.4 и Android версии 18.1 есть метод для вывода списка файлов.

Документация немного разреженный до сих пор, поэтому я рекомендую проверить ответ Rosario в подробности.


Предыдущий ответ, поскольку этот подход иногда может быть полезен:

В настоящее время в Firebase SDK нет вызова API для вывода списка всех файлов в папке Cloud Storage из приложения. Если вам нужна такая функциональность, вы должны хранить метаданные файлов (например, URL-адреса для загрузки) в месте, где вы можете их перечислить. Database Firebase в режиме реального времени и Cloud Firestore идеально подходит для этого , и позволяет также легко обмениваться URL - адрес с другими.

Вы можете найти хороший (но несколько запутанный) образец этого в нашем приложении FriendlyPix . Соответствующий код для веб-версии находится здесь , но есть также версии для iOS и Android.

Франк ван Пуффелен
источник
8
Собираетесь ли вы реализовать это в Firebase?
Pier
55
Если мне нужно сохранить URL-адреса всех моих файлов хранилища в базе данных Realtime, то для чего нужна иерархия папок в хранилище? все файлы, имеющие уникальное имя, могут храниться на одном уровне, папки не нужны !!! видите, это противоречие !!! По сути, основное обоснование иерархии папок - это запросы с подстановочными знаками без предварительного знания того, что у вас есть в папке, что вы необоснованно не предоставляете.
abedfar
7
Firebase Storage построена на базе Google Cloud Storage, которая делает именно то, что вы говорите: хранит все объекты в одном длинном списке. Firebase Storage моделирует иерархию поверх этого, по общему признанию, как дырявую абстракцию. Общие причины использования папки в Firebase Storage - логическое разделение данных и создание правил безопасности на основе структуры папок.
Франк ван Пуффелен
8
Что произойдет, если соединение пользователя будет потеряно после загрузки и до сохранения downloadUrl в базе данных? Как мы обнаруживаем существующие файлы в папке в таком случае?
Освальдо
10
Что насчет сейчас? Есть ли прямой API для этого в 2018 году?
Diaz diaz
49

По состоянию на май 2019 года версия 6.1.0 SDK Firebase для облачного хранилища теперь поддерживает перечисление всех объектов из корзины. Вам просто нужно позвонить listAll()в Reference:

    // Since you mentioned your images are in a folder,
    // we'll create a Reference to that folder:
    var storageRef = firebase.storage().ref("your_folder");


    // Now we get the references of these images
    storageRef.listAll().then(function(result) {
      result.items.forEach(function(imageRef) {
        // And finally display them
        displayImage(imageRef);
      });
    }).catch(function(error) {
      // Handle any errors
    });

    function displayImage(imageRef) {
      imageRef.getDownloadURL().then(function(url) {
        // TODO: Display the image on the UI
      }).catch(function(error) {
        // Handle any errors
      });
    }

Обратите внимание, что для использования этой функции вы должны подписаться на версию 2 Правил безопасности , что можно сделать, указав rules_version = '2';в первой строке своих правил безопасности:

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {

Я бы рекомендовал проверить документацию для получения дополнительной информации.

Кроме того, согласно настройке , на шаге 5 этот сценарий не разрешен, Node.jsпоскольку require("firebase/app");он не будет возвращаться firebase.storage()как функция. Это достигается только с помощью import * as firebase from 'firebase/app';.

Росарио Перейра Фернандес
источник
какой плагин вы используете
azheen
@azheen Полагаю, вы используете Flutter. К сожалению, на флаттерфайре этого пока нет. Вы можете отслеживать это по этому вопросу
Розарио Перейра Фернандес
33

С марта 2017 года: с добавлением облачных функций Firebase и более глубокой интеграцией Firebase с Google Cloud это стало возможным.

С помощью Cloud Functions вы можете использовать пакет Google Cloud Node для выполнения эпических операций в облачном хранилище. Ниже приведен пример, который получает все URL-адреса файлов в массив из облачного хранилища. Эта функция будет срабатывать каждый раз, когда что-то сохраняется в облачном хранилище Google.

Примечание 1. Это довольно дорогостоящая операция, поскольку она должна циклически перебирать все файлы в корзине / папке.

Примечание 2 : я написал это просто как пример, не вдаваясь в подробности обещаний и т. Д. Просто чтобы дать представление.

const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();

// let's trigger this function with a file upload to google cloud storage

exports.fileUploaded = functions.storage.object().onChange(event => {

  const object = event.data; // the object that was just uploaded
  const bucket = gcs.bucket(object.bucket);
  const signedUrlConfig = { action: 'read', expires: '03-17-2025' }; // this is a signed url configuration object

  var fileURLs = []; // array to hold all file urls 

  // this is just for the sake of this example. Ideally you should get the path from the object that is uploaded :)
  const folderPath = "a/path/you/want/its/folder/size/calculated";

  bucket.getFiles({ prefix: folderPath }, function(err, files) {
    // files = array of file objects
    // not the contents of these files, we're not downloading the files. 

    files.forEach(function(file) {
      file.getSignedUrl(signedUrlConfig, function(err, fileURL) {
        console.log(fileURL);
        fileURLs.push(fileURL);
      });
    });

  });

});

Надеюсь, это даст вам общее представление. Чтобы получить лучшие примеры облачных функций, ознакомьтесь с репозиторием Google на Github, полным примеров облачных функций для Firebase . Также ознакомьтесь с их документацией по API Google Cloud Node.

Johnozbay
источник
35
Это слишком глупо, что firebase не просто добавляет этот api в sdk
firebase
4
@ Тайна Я думаю, это связано с масштабом. Им нужно думать не только о небольших приложениях, но и о гигантах. Что делать, если в пути есть тысячи файлов. Эта операция потребовала бы много вычислительной мощности, и ей пришлось бы обращаться к базе данных для каждого, казалось бы, невинного и простого вызова. Чем глубже я углубляюсь в масштабное использование firebase, тем лучше понимаю, почему были сделаны определенные компромиссы.
johnozbay
1
В этом gcs api также есть ограничение и разбивка на страницы. В этом случае ответственность за понимание риска и попытку выбрать метод, который можно масштабировать, является обязанностью потребителя API. Но излишне опекать, поэтому отказываться от нашего варианта - не лучшее решение. Они могут взимать плату за большую нагрузку, если она действительно стоит
денег
1
это должен быть главный ответ! Спасибо за внимание. В настоящее время синтаксис отличается от вашего примера. Вместо того, чтобы отправлять обратный вызов в качестве параметра, вы должны связать .thenследующее:this.bucket .getFiles({ prefix: 'path/to/directory' }) .then((arr) => {})
JP Lew
1
@JPLew Пожалуйста :) Что касается синтаксиса, они возвращают обещание, только если обратный вызов исключен. Так что безопасно использовать то, что вам больше нравится. См. Пример здесь: cloud.google.com/nodejs/docs/reference/storage/1.3.x/…
johnozbay
20

Поскольку в списке нет языка, я отвечу на это на Swift. Мы настоятельно рекомендуем использовать Firebase Storage и Firebase Realtime Database вместе для составления списков загрузок:

Общий:

// Firebase services
var database: FIRDatabase!
var storage: FIRStorage!
...
// Initialize Database, Auth, Storage
database = FIRDatabase.database()
storage = FIRStorage.storage()
...
// Initialize an array for your pictures
var picArray: [UIImage]()

Загрузить:

let fileData = NSData() // get data...
let storageRef = storage.reference().child("myFiles/myFile")
storageRef.putData(fileData).observeStatus(.Success) { (snapshot) in
  // When the image has successfully uploaded, we get it's download URL
  let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString
  // Write the download URL to the Realtime Database
  let dbRef = database.reference().child("myFiles/myFile")
  dbRef.setValue(downloadURL)
}

Скачать:

let dbRef = database.reference().child("myFiles")
dbRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in
  // Get download URL from snapshot
  let downloadURL = snapshot.value() as! String
  // Create a storage reference from the URL
  let storageRef = storage.referenceFromURL(downloadURL)
  // Download the data, assuming a max size of 1MB (you can change this as necessary)
  storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
    // Create a UIImage, add it to the array
    let pic = UIImage(data: data)
    picArray.append(pic)
  })
})

Для получения дополнительной информации см. Практический пример того, как это сделать , в разделе От нуля до приложения: разработка с помощью Firebase и связанного с ним исходного кода .

Майк Макдональд
источник
3
Но как мне получить тот же результат с Cloud Firestore?)
Макс Краев
5

Обходной путь может заключаться в создании файла (например, list.txt), внутри которого ничего нет. В этом файле вы можете установить собственные метаданные (то есть Map <String, String>) со списком всех URL-адресов файла.
Поэтому, если вам нужно загрузить все файлы в fodler, вы сначала загружаете метаданные из файла list.txt, затем перебираете пользовательские данные и загружаете все файлы с URL-адресами на карте.

Андреа
источник
4
Да, это обходной путь, но он не может обрабатывать одновременную запись в один list.txt
linquize 01
5

Я тоже столкнулся с этой проблемой, когда работал над своим проектом. Я действительно хочу, чтобы они предоставили метод end api. В любом случае, вот как я это сделал: когда вы загружаете изображение в хранилище Firebase, создайте объект и одновременно передайте этот объект в базу данных Firebase. Этот объект содержит URI загрузки изображения.

trailsRef.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Uri downloadUri = taskSnapshot.getDownloadUrl();
            DatabaseReference myRef = database.getReference().child("trails").child(trail.getUnique_id()).push();
            Image img = new Image(trail.getUnique_id(), downloadUri.toString());
            myRef.setValue(img);
        }
    });

Позже, когда вы захотите загрузить изображения из папки, вы просто перебираете файлы в этой папке. Эта папка имеет то же имя, что и «папка» в хранилище Firebase, но вы можете называть их как хотите. Выложил их в отдельную ветку.

 @Override
protected List<Image> doInBackground(Trail... params) {

    String trialId = params[0].getUnique_id();
    mDatabase = FirebaseDatabase.getInstance().getReference();
    mDatabase.child("trails").child(trialId).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            images = new ArrayList<>();
            Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator();
            while (iter.hasNext()) {
                Image img = iter.next().getValue(Image.class);
                images.add(img);
            }
            isFinished = true;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

Теперь у меня есть список объектов, содержащих URI каждого изображения, и я могу делать с ними все, что хочу. Чтобы загрузить их в imageView, я создал еще один поток.

    @Override
protected List<Bitmap> doInBackground(List<Image>... params) {

    List<Bitmap> bitmaps = new ArrayList<>();

    for (int i = 0; i < params[0].size(); i++) {
        try {
            URL url = new URL(params[0].get(i).getImgUrl());
            Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            bitmaps.add(bmp);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return bitmaps;
}

Это возвращает список Bitmap, когда он заканчивается, я просто прикрепляю их к ImageView в основном действии. Ниже перечислены методы @Override, потому что у меня созданы интерфейсы и ожидаются их завершения в других потоках.

    @Override
public void processFinishForBitmap(List<Bitmap> bitmaps) {
    List<ImageView> imageViews = new ArrayList<>();
    View v;
    for (int i = 0; i < bitmaps.size(); i++) {
        v = mInflater.inflate(R.layout.gallery_item, mGallery, false);
        imageViews.add((ImageView) v.findViewById(R.id.id_index_gallery_item_image));
        imageViews.get(i).setImageBitmap(bitmaps.get(i));
        mGallery.addView(v);
    }
}

Обратите внимание, что мне нужно сначала дождаться возврата изображения списка, а затем вызвать поток для работы с растровым изображением списка. В этом случае изображение содержит URI.

    @Override
public void processFinish(List<Image> results) {
    Log.e(TAG, "get back " + results.size());

    LoadImageFromUrlTask loadImageFromUrlTask =  new LoadImageFromUrlTask();
    loadImageFromUrlTask.delegate = this;
    loadImageFromUrlTask.execute(results);
}

Надеюсь, кто-то сочтет это полезным. Он также будет служить линией гильдии для меня в будущем.

Дао
источник
5

Еще один способ добавить изображение в базу данных с помощью облачной функции для отслеживания каждого загруженного изображения и сохранения его в базе данных.

exports.fileUploaded = functions.storage.object().onChange(event => {

    const object = event.data; // the object that was just uploaded
    const contentType = event.data.contentType; // This is the image Mimme type\

    // Exit if this is triggered on a file that is not an image.
    if (!contentType.startsWith('image/')) {
        console.log('This is not an image.');
        return null;
    }

    // Get the Signed URLs for the thumbnail and original image.
    const config = {
        action: 'read',
        expires: '03-01-2500'
    };

    const bucket = gcs.bucket(event.data.bucket);
    const filePath = event.data.name;
    const file = bucket.file(filePath);

    file.getSignedUrl(config, function(err, fileURL) {
        console.log(fileURL);
        admin.database().ref('images').push({
            src: fileURL
        });
    });
});

Полный код здесь: https://gist.github.com/bossly/fb03686f2cb1699c2717a0359880cf84

Олег Байдалка
источник
5

Для node js я использовал этот код

const Storage = require('@google-cloud/storage');
const storage = new Storage({projectId: 'PROJECT_ID', keyFilename: 'D:\\keyFileName.json'});
const bucket = storage.bucket('project.appspot.com'); //gs://project.appspot.com
bucket.getFiles().then(results => {
    const files = results[0];
    console.log('Total files:', files.length);
    files.forEach(file => {
      file.download({destination: `D:\\${file}`}).catch(error => console.log('Error: ', error))
    });
}).catch(err => {
    console.error('ERROR:', err);
  });
Туанань
источник
Ты только что спас мне день !!
hugo blanc
4

Вы можете вывести список файлов в каталоге хранилища firebase методом listAll (). Чтобы использовать этот метод, необходимо реализовать эту версию хранилища firebase. 'com.google.firebase: firebase-storage: 18.1.1'

https://firebase.google.com/docs/storage/android/list-files

Помните, что обновите Правила безопасности до версии 2.

Ёнхван Шин
источник
3

На самом деле это возможно, но только с помощью Google Cloud API вместо Firebase. Это связано с тем, что хранилище Firebase - это сегмент облачного хранилища Google, к которому можно легко получить доступ с помощью API-интерфейсов Google Cloud, однако вам необходимо использовать OAuth для аутентификации вместо Firebase.

Дзен М
источник
3

Я столкнулся с той же проблемой, моя еще сложнее.

Администратор загрузит аудио и pdf файлы в хранилище:

  • аудио / сезон1, сезон2 ... / класс1, класс 2 / файлы .mp3

  • книги / файлы .pdf

Приложение Android должно получить список подпапок и файлов.

Решение заключается в перехвате события загрузки в хранилище и создании такой же структуры в хранилище с использованием облачной функции.

Шаг 1. Создайте вручную коллекцию "хранилище" и документ "аудио / книги" в firestore

введите описание изображения здесь

Шаг 2: Настройте облачную функцию

Может занять около 15 минут: https://www.youtube.com/watch?v=DYfP-UIKxH0&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=1

Шаг 3. Захватите событие загрузки с помощью облачной функции

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);
const path = require('path');

export const onFileUpload = functions.storage.object().onFinalize(async (object) => {
        let filePath = object.name; // File path in the bucket.
        const contentType = object.contentType; // File content type.
        const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
        if (metageneration !== "1") return;

        // Get the file name.
        const fileName = path.basename(filePath);
        filePath = filePath.substring(0, filePath.length - 1);
        console.log('contentType ' + contentType);
        console.log('fileName ' + fileName);
        console.log('filePath ' + filePath);
        console.log('path.dirname(filePath) ' + path.dirname(filePath));
        filePath = path.dirname(filePath);
        const pathArray = filePath.split("/");
        let ref = '';
        for (const item of pathArray) {
            if (ref.length === 0) {
                ref = item;
            }
            else {
                ref = ref.concat('/sub/').concat(item);
            }
        }

        ref = 'storage/'.concat(ref).concat('/sub')
        admin.firestore().collection(ref).doc(fileName).create({})
                .then(result => {console.log('onFileUpload:updated')})
                .catch(error => {
                    console.log(error);
                });
    });

Шаг 4. Получите список папок / файлов в приложении Android с помощью firestore.

private static final String STORAGE_DOC = "storage/";
    public static void getMediaCollection(String path, OnCompleteListener onCompleteListener) {
        String[] pathArray = path.split("/");
        String doc = null;
        for (String item : pathArray) {
            if (TextUtils.isEmpty(doc)) doc = STORAGE_DOC.concat(item);
            else doc = doc.concat("/sub/").concat(item);
        }
        doc = doc.concat("/sub");

        getFirestore().collection(doc).get().addOnCompleteListener(onCompleteListener);
    }

Шаг 5. Получите URL для загрузки

public static void downloadMediaFile(String path, OnCompleteListener<Uri> onCompleteListener) {
        getStorage().getReference().child(path).getDownloadUrl().addOnCompleteListener(onCompleteListener);
    }

Заметка

Мы должны поместить «вспомогательную» коллекцию в каждый элемент, поскольку firestore не поддерживает получение списка коллекции.

На поиск решения у меня ушло 3 дня, надеюсь, у вас уйдет не более 3 часов.

Ура.

thanhbinh84
источник
Точно такой же сценарий, над которым я работаю. Может ли кто-нибудь прислать мне код флаттера? потому что мне нужно загружать только пакет файлов, а не загружать.
Махеш Пери
Flutter SDK (язык дротиков)
Махеш Пери
1
Cloud Firestore еще не поддерживает флаттер firebase.google.com/docs/firestore . Быстрый подход заключается в написании API с использованием облачной функции с последующим доступом к этому API через restful, как обычно. На ознакомление с функцией облака может потребоваться несколько часов, эти обучающие видео довольно легко проглотить: D youtube.com/…
thanhbinh84
3

Расширение ответа Росарио Перейры Фернандеса для решения JavaScript:

  1. Установите firebase на свой компьютер
npm install -g firebase-tools

  1. В firebase init установлен JavaScriptкак язык по умолчанию
  2. В корневой папке созданного проекта выполните npm installs
   npm install --save firebase
   npm install @google-cloud/storage
   npm install @google-cloud/firestore
   ... <any other dependency needed>
  1. Добавьте нестандартные зависимости в свой проект, например
    "firebase": "^6.3.3",
    "@google-cloud/storage": "^3.0.3"

функции / package.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "@google-cloud/storage": "^3.0.3",
    "firebase": "^6.3.3",
    "firebase-admin": "^8.0.0",
    "firebase-functions": "^3.1.0"
  },
  "devDependencies": {
    "eslint": "^5.12.0",
    "eslint-plugin-promise": "^4.0.1",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

  1. Создать своего рода listAllфункцию

index.js

var serviceAccount = require("./key.json");
const functions = require('firebase-functions');

const images = require('./images.js');

var admin = require("firebase-admin");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://<my_project>.firebaseio.com"
});

const bucket = admin.storage().bucket('<my_bucket>.appspot.com')

exports.getImages = functions.https.onRequest((request, response) => {
    images.getImages(bucket)
        .then(urls => response.status(200).send({ data: { urls } }))
        .catch(err => console.error(err));
})

images.js

module.exports = {
    getImages
}

const query = {
    directory: 'images'
};

function getImages(bucket) {
    return bucket.getFiles(query)
        .then(response => getUrls(response))
        .catch(err => console.error(err));
}

function getUrls(response) {
    const promises = []
    response.forEach( files => {
        files.forEach (file => {
            promises.push(getSignedUrl(file));
        });
    });
    return Promise.all(promises).then(result => getParsedUrls(result));
}

function getSignedUrl(file) {
    return file.getSignedUrl({
        action: 'read',
        expires: '09-01-2019'
    })
}

function getParsedUrls(result) {
    return JSON.stringify(result.map(mediaLink => createMedia(mediaLink)));
}

function createMedia(mediaLink) {
    const reference = {};
    reference.mediaLink = mediaLink[0];
    return reference;
}

  1. Выполнить firebase deployдля загрузки облачной функции
  2. Вызов пользовательской функции из приложения

build.gradle

dependencies {
...
  implementation 'com.google.firebase:firebase-functions:18.1.0'
...
}

котлин класс

  private val functions = FirebaseFunctions.getInstance()
  val cloudFunction = functions.getHttpsCallable("getImages")
  cloudFunction.call().addOnSuccessListener {...}

Что касается дальнейшего развития этой функции, я столкнулся с некоторыми проблемами, которые могли здесь найти .

Виктор Р. Оливейра
источник
2

Для этого с помощью JS

Вы можете добавить их прямо в свой контейнер div или отправить их в массив. Ниже показано, как добавить их в свой div.

1) Когда вы храните изображения в хранилище, создайте ссылку на изображение в базе данных firebase со следующей структурой

/images/(imageName){
   description: "" , 
   imageSrc : (imageSource) 
}

2) Когда вы загружаете документ, вытаскиваете все URL-адреса источников изображений из базы данных, а не из хранилища, с помощью следующего кода

$(document).ready(function(){

var query = firebase.database().ref('images/').orderByKey();
query.once("value").then(function(snapshot){

    snapshot.forEach(function(childSnapshot){

        var imageName = childSnapshot.key;
        var childData = childSnapshot.val();
        var imageSource = childData.url;

        $('#imageGallery').append("<div><img src='"+imageSource+"'/></div>");

    })
})
});
МакДо
источник
2

Вы можете использовать следующий код. Здесь я загружаю изображение в хранилище firebase, а затем сохраняю URL-адрес загрузки изображения в базу данных firebase.

//getting the storage reference
            StorageReference sRef = storageReference.child(Constants.STORAGE_PATH_UPLOADS + System.currentTimeMillis() + "." + getFileExtension(filePath));

            //adding the file to reference 
            sRef.putFile(filePath)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            //dismissing the progress dialog
                            progressDialog.dismiss();

                            //displaying success toast 
                            Toast.makeText(getApplicationContext(), "File Uploaded ", Toast.LENGTH_LONG).show();

                            //creating the upload object to store uploaded image details 
                            Upload upload = new Upload(editTextName.getText().toString().trim(), taskSnapshot.getDownloadUrl().toString());

                            //adding an upload to firebase database 
                            String uploadId = mDatabase.push().getKey();
                            mDatabase.child(uploadId).setValue(upload);
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception exception) {
                            progressDialog.dismiss();
                            Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            //displaying the upload progress 
                            double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                            progressDialog.setMessage("Uploaded " + ((int) progress) + "%...");
                        }
                    });

Теперь, чтобы получить все изображения, хранящиеся в базе данных firebase, вы можете использовать

//adding an event listener to fetch values
        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                //dismissing the progress dialog 
                progressDialog.dismiss();

                //iterating through all the values in database
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Upload upload = postSnapshot.getValue(Upload.class);
                    uploads.add(upload);
                }
                //creating adapter
                adapter = new MyAdapter(getApplicationContext(), uploads);

                //adding adapter to recyclerview
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                progressDialog.dismiss();
            }
        });

Более подробную информацию вы можете найти в моем сообщении Пример хранилища Firebase .

Белал Хан
источник
Я последовал вашему примеру в ссылке, но изображения не отображаются из Firebase в RecyclerView
Wolfiebae
1

Итак, у меня был проект, который требовал загрузки ресурсов из хранилища firebase, поэтому мне пришлось решать эту проблему самостоятельно. Вот как:

1- Сначала создайте данные модели, например class Choice{}, в этом классе определяется строковая переменная с именем image Name, чтобы она была такой

class Choice {
    .....
    String imageName;
}

2- из базы данных / базы данных firebase перейдите и жестко закодируйте имена изображений для объектов, поэтому, если у вас есть имя изображения Apple.png, создайте объект, который будет

Choice myChoice = new Choice(...,....,"Apple.png");

3- Теперь получите ссылку на активы в хранилище firebase, которая будет примерно такой

gs://your-project-name.appspot.com/

как этот

4- наконец, инициализируйте ссылку на хранилище firebase и начните получать файлы таким циклом

storageRef = storage.getReferenceFromUrl(firebaseRefURL).child(imagePath);

File localFile = File.createTempFile("images", "png");
storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {

@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
    //Dismiss Progress Dialog\\
}

5- вот и все

Бригт Лигт
источник
1
#In Python

import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
import datetime
import urllib.request


def image_download(url, name_img) :
    urllib.request.urlretrieve(url, name_img)

cred = credentials.Certificate("credentials.json")

# Initialize the app with a service account, granting admin privileges
app = firebase_admin.initialize_app(cred, {
    'storageBucket': 'YOURSTORAGEBUCKETNAME.appspot.com',
})
url_img = "gs://YOURSTORAGEBUCKETNAME.appspot.com/"
bucket_1 = storage.bucket(app=app)
image_urls = []

for blob in bucket_1.list_blobs():
    name = str(blob.name)
    #print(name)
    blob_img = bucket_1.blob(name)
    X_url = blob_img.generate_signed_url(datetime.timedelta(seconds = 300), method='GET')
    #print(X_url)
    image_urls.append(X_url)


PATH = ['Where you want to save the image']
for path in PATH:
    i = 1
    for url  in image_urls:
        name_img = str(path + "image"+str(i)+".jpg")
        image_download(url, name_img)
        i+=1
Милан Хазра
источник
Нет необходимости в API, вам просто нужен простой класс Python и ключевое слово blob
Милан Хазра
0

Я использую AngularFireи использую следующее, чтобы получить всеdownloadURL

getPhotos(id: string): Observable<string[]> {
    const ref = this.storage.ref(`photos/${id}`)
    return ref.listAll().pipe(switchMap(list => {
      const calls: Promise<string>[] = [];
      list.items.forEach(item => calls.push(item.getDownloadURL()))
      return Promise.all(calls)
    }));
}
Набель
источник
-1

Для Android лучший способ - использовать FirebaseUI и Glide.

Вам нужно добавить это в свой gradle / app, чтобы получить библиотеку. Обратите внимание, что на нем уже есть Glide!

implementation 'com.firebaseui:firebase-ui-storage:4.1.0'

А затем в вашем коде используйте

// Reference to an image file in Cloud Storage
StorageReference storageReference = FirebaseStorage.getInstance().getReference();

// ImageView in your Activity
ImageView imageView = findViewById(R.id.imageView);

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(this /* context */)
        .load(storageReference)
        .into(imageView);
Дагного Жан-Франсуа
источник