Я працюю над завантаженням зображень, все працює чудово, але у мене є 100 фотографій, і я хотів би показати їх усі в своєму View
, оскільки я отримую повний список зображень у папці, я не можу знайти жодного API для цього робота.
Я працюю над завантаженням зображень, все працює чудово, але у мене є 100 фотографій, і я хотів би показати їх усі в своєму View
, оскільки я отримую повний список зображень у папці, я не можу знайти жодного API для цього робота.
Відповіді:
Оскільки пакети 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.
Станом на травень 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';
.
Починаючи з березня 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
.then
так:this.bucket .getFiles({ prefix: 'path/to/directory' }) .then((arr) => {})
Оскільки мови в списку немає, я відповім на це у 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 та пов’язаний з нею вихідний код .
Обхідним способом може бути створення файлу (тобто list.txt), в якому нічого не знаходиться, в цьому файлі ви можете встановити власні метадані (тобто Map <String, String>) зі списком усіх URL-адрес файлу.
Отже, якщо вам потрібно зафіксувати всі файли у фудлері, ви спочатку завантажуєте метадані файла list.txt, потім перебираєте користувальницькі дані та завантажуєте всі файли з URL-адресами на карті.
Я також стикався з цією проблемою, коли працював над своїм проектом. Я дуже хочу, щоб вони надавали кінцевий метод 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);
}
Сподіваємось, хтось вважає це корисним. Це також буде слугувати цільовою лінією для мене і в майбутньому.
Ще один спосіб додати зображення до бази даних за допомогою функції 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
Для вузла 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);
});
Ви можете перелічити файли в каталозі сховища Firebase методом listAll (). Щоб скористатися цим методом, доведеться реалізувати цю версію сховища Firebase. 'com.google.firebase: firebase-storage: 18.1.1'
https://firebase.google.com/docs/storage/android/list-files
Майте на увазі, що оновіть правила безпеки до версії 2.
Насправді це можливо, але лише за допомогою Google Cloud API, а не від Firebase. Це тому, що Firebase Storage - це хмарне сховище Google, до якого можна легко дістатися за допомогою API Cloud Cloud, однак вам потрібно використовувати OAuth для автентифікації замість Firebase.
Я зіткнувся з тим же питанням, моє ще складніше.
Адміністратор завантажить аудіо та 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 години.
Ура.
Розширення відповіді Розаріо Перейра Фернандес на рішення JavaScript:
npm install -g firebase-tools
JavaScript
як мова за замовчуванням npm install --save firebase
npm install @google-cloud/storage
npm install @google-cloud/firestore
... <any other dependency needed>
"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
}
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;
}
firebase deploy
щоб завантажити свою функцію хмари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 {...}
Щодо подальшого розвитку цієї функції, я зіткнувся з деякими проблемами, які можуть бути тут знайдені .
Для цього з 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>");
})
})
});
Можна використовувати наступний код. Тут я завантажую зображення у сховище 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, тому мені довелося вирішити цю проблему самостійно. Ось як:
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- це все
#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
Я використовую 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)
}));
}
Для 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);