Як отримати список усіх файлів у Cloud Storage у програмі Firebase?


101

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


Чи можете ви опублікувати повне рішення коду?
ISS

Відповіді:


92

Оскільки пакети SDK Firebase для версії JavaScript 6.1 , випуск iOS 6.4 та версія Android 18.1 мають метод переліку файлів.

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


Попередня відповідь, оскільки такий підхід може бути корисним часом:

Наразі в SDK Firebase не існує дзвінка API, щоб перелічити всі файли в папці Cloud Storage із програми. Якщо вам потрібна така функціональність, ви повинні зберігати метадані файлів (наприклад, URL-адреси для завантаження) у місці, де ви можете їх перелічити. Database Firebase в режимі реального часу і Cloud Firestore ідеально підходить для цього , і дозволяє також легко обмінюватися URL - адреса з іншими.

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


8
Ви збираєтесь реалізувати це на Firebase?
П'єр

55
Якщо мені потрібно зберегти URL-адреси всіх моїх файлів зберігання в базі даних Realtime, то яка мета мати ієрархію папок у сховищі? всі файли, що мають унікальне ім’я, можуть зберігатися в одному рівні, папки взагалі не потребують !!! бачите, це суперечність !!! В основному, основним обґрунтуванням ієрархії папок є запити під магістральними картами без попереднього знання того, що у вас є в папці, які ви не надаєте розумно.
abedfar

7
Firebase Storage створений на Google Cloud Storage, який робить саме те, що ви говорите: він зберігає всі об’єкти в одному довгому списку. Firebase Storage моделює ієрархію поверх цього, мабуть, як проникливу абстракцію. Найпоширеніші причини використання папки у Firebase Storage - це розділення логічних даних та створення правил безпеки, заснованих на структурі папок.
Франк ван Пуффелен

8
Що станеться, якщо після завантаження та перед збереженням downloadUrl до бази даних буде втрачено з'єднання з користувачем? Як у цьому випадку ми виявимо наявні файли в папці?
Освальдо

10
А зараз ? Чи є прямий API для цього в 2018 році?
Діас діаз

46

Станом на травень 2019 року версія 6.1.0 Firebase SDK для Cloud Cloud Storage тепер підтримує перелік усіх об’єктів із відра. Вам просто потрібно зателефонувати 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 ви можете використовувати пакет Cloud Cloud Node для виконання епічних операцій у Cloud Storage. Нижче наведено приклад, який отримує всі URL-адреси файлів у масив із Cloud Storage. Ця функція буде запускатися щоразу, коли щось збережене у хмарному сховищі 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 Cloud Cloud Node


35
Це занадто нерозумно, що firebase не просто додає цю api до firebase sdk
Thaina

4
@Thaina Я думаю, що це стосується масштабу. Вони повинні думати не лише про невеликі додатки, а й про гігантів. Що робити, якщо шлях містить тисячі файлів. Ця операція вимагала б багато обчислювальної потужності, і вона мала б посилатися на базу даних для кожного, здавалося б, невинного і простого дзвінка. Чим глибше я заглиблювався у використання Firebase в масштабі, тим краще я розумію, чому були зроблені певні компроміси.
johnozbay

1
У цьому gcs api у нього також є обмеження та розширення сторінки. Тоді відповідальність споживачів API є знати ризик та спробувати вибрати метод, який міг би масштабуватись. Але бути надмірно захищеним, тому вирішити наш варіант - не вдале рішення. Вони можуть стягувати великі навантаження, якщо це дійсно коштує
Thaina

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 і базу даних Realtime Firebase разом, щоб виконати списки завантажень:

Спільний доступ:

// 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)
  })
})

Для отримання додаткової інформації див практичний приклад того, як це зробити , перегляньте статтю Zero to App: Developer with Firebase та пов’язаний з нею вихідний код .


3
Але як я можу отримати такий же результат із Cloud Firestore?)
Макс Краєв

5

Обхідним способом може бути створення файлу (тобто list.txt), в якому нічого не знаходиться, в цьому файлі ви можете встановити власні метадані (тобто Map <String, String>) зі списком усіх URL-адрес файлу.
Отже, якщо вам потрібно зафіксувати всі файли у фудлері, ви спочатку завантажуєте метадані файла list.txt, потім перебираєте користувальницькі дані та завантажуєте всі файли з URL-адресами на карті.


4
Так, це обхідне рішення, але не вдається обробити одночасне записування в єдиний список.txt
linquize

5

Я також стикався з цією проблемою, коли працював над своїм проектом. Я дуже хочу, щоб вони надавали кінцевий метод 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);
    }
}

Зауважте, що я повинен зачекати, коли зображення списку буде повернуто спочатку, а потім викликати потік для роботи над List Bitmap. У цьому випадку зображення містить 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

Ще один спосіб додати зображення до бази даних за допомогою функції Cloud Cloud для відстеження кожного завантаженого зображення та збереження його в базі даних.

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

Для вузла 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 Storage - це хмарне сховище Google, до якого можна легко дістатися за допомогою API Cloud Cloud, однак вам потрібно використовувати OAuth для автентифікації замість Firebase.


3

Я зіткнувся з тим же питанням, моє ще складніше.

Адміністратор завантажить аудіо та PDF-файли у сховище:

  • аудіо / Season1, Season2 ... / class1, class 2 / .mp3 файли

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

Додаток Android повинен отримати список підпапок і файлів.

Рішення полягає в лові події завантаження на сховище та створення тієї самої структури в firestore за допомогою хмарної функції.

Крок 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);
    }

Примітка

Ми маємо поставити колекцію "sub" до кожного елемента, оскільки firestore не підтримує отримання списку колекції.

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

Ура.


Точно той самий сценарій, над яким я працюю. Чи може хто-небудь надіслати мені флеттерний код? тому що я можу завантажувати лише партію файлів, а не для завантаження.
Mahesh Peri

Flutter SDK (dart language)
Mahesh Peri

1
хмара firestore ще не підтримує мерехтіння firebase.google.com/docs/firestore . Швидкий підхід - це написання API за допомогою хмарної функції, а потім доступ до цих API через спокійний звичайний спосіб. Щоб ознайомитись із функцією хмари, може знадобитися кілька годин. Ці тренувальні відео проковтнути досить легко: D youtube.com/…
thanhbinh84

3

Розширення відповіді Розаріо Перейра Фернандес на рішення JavaScript:

  1. Встановіть вогневу базу на свою машину
npm install -g firebase-tools

  1. На Firebase init встановлений JavaScriptяк мова за замовчуванням
  2. У кореневій папці створеного проекту виконуємо встановлення npm
   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 або ви можете натиснути на масив. Нижче показано, як додати їх до своєї діви.

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{}, у цьому класі визначено змінну String, яку називають Name image, так вона буде такою

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

2- із бази даних / firebase, перейдіть і введіть жорсткий код імен зображень на об'єкти, тому якщо у вас є ім'я зображення під назвою Apple.png, створіть об'єкт для

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

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

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

як ця

4- нарешті, ініціалізуйте свою посилання на сховище файлової бази та починайте отримувати файли подібним циклом

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.