¿Cómo obtener una lista de todos los archivos en Cloud Storage en una aplicación Firebase?
Estoy trabajando en cargar imágenes, todo funciona muy bien, pero tengo 100 imágenes y me gustaría mostrarlas todas en mi archivo View
, ya que obtengo la lista completa de las imágenes en una carpeta, no puedo encontrar ninguna API para esto. trabajar.
Dado que los SDK de Firebase para JavaScript versión 6.1 , iOS versión 6.4 y Android versión 18.1 tienen un método para enumerar archivos.
La documentación es un poco escasa hasta ahora, por lo que recomiendo consultar la respuesta de Rosário para obtener más detalles.
Respuesta anterior, ya que este enfoque aún puede resultar útil en ocasiones:
Actualmente no hay ninguna llamada API en el SDK de Firebase para enumerar todos los archivos en una carpeta de Cloud Storage desde una aplicación. Si necesita dicha funcionalidad, debe almacenar los metadatos de los archivos (como las URL de descarga) en un lugar donde pueda enumerarlos. Firebase Realtime Database y Cloud Firestore son perfectos para esto y también le permiten compartir fácilmente las URL con otras personas.
Puede encontrar una buena (pero algo complicada) muestra de esto en nuestra aplicación de muestra FriendlyPix . El código relevante para la versión web está aquí , pero también hay versiones para iOS y Android.
A partir de mayo de 2019, la versión 6.1.0 del SDK de Firebase para Cloud Storage ahora admite enumerar todos los objetos de un depósito. Simplemente necesita llamar listAll()
a 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
});
}
Tenga en cuenta que para utilizar esta función, debe optar por la versión 2 de las Reglas de seguridad , lo que se puede hacer creando rules_version = '2';
la primera línea de sus reglas de seguridad:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
Recomiendo consultar los documentos para obtener más referencias.
Además, según setup , en el Paso 5, este script no está permitido ya Node.js
que require("firebase/app");
no volverá firebase.storage()
como una función. Esto sólo se logra usando import * as firebase from 'firebase/app';
.
Desde marzo de 2017: con la incorporación de Firebase Cloud Functions y la integración más profunda de Firebase con Google Cloud, esto ahora es posible.
Con Cloud Functions puedes usar el paquete Google Cloud Node para realizar operaciones épicas en Cloud Storage. A continuación se muestra un ejemplo que coloca todas las URL de archivos en una matriz desde Cloud Storage. Esta función se activará cada vez que se guarde algo en el almacenamiento en la nube de Google.
Nota 1 : Esta es una operación bastante costosa desde el punto de vista computacional, ya que tiene que recorrer todos los archivos en un depósito/carpeta.
Nota 2 : Escribí esto solo como un ejemplo, sin dar muchos detalles en las promesas, etc. Solo para dar una idea.
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);
});
});
});
});
Espero que esto les dé una idea general. Para obtener mejores ejemplos de funciones en la nube, consulte el repositorio Github de Google, lleno de ejemplos de funciones en la nube para Firebase . Consulte también la documentación de la API de Google Cloud Node
Como no aparece ningún idioma en la lista, responderé esto en Swift. Recomendamos encarecidamente utilizar Firebase Storage y Firebase Realtime Database juntos para realizar listas de descargas:
Compartido:
// 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]()
Subir:
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)
}
Descargar:
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)
})
})
Para obtener más información, consulte Zero to App: Desarrollar con Firebase y su código fuente asociado para ver un ejemplo práctico de cómo hacer esto.
Combinando algunas respuestas de esta publicación y también de aquí , y después de una investigación personal, para NodeJS con mecanografiado logré esto usando firebase-admin
:
import * as admin from 'firebase-admin';
const getFileNames = () => {
admin.storage().bucket().getFiles(autoPaginate: false).then(([files]: any) => {
const fileNames = files.map((file: any) => file.name);
return fileNames;
})
}
En mi caso, también necesitaba obtener todos los archivos dentro de una carpeta específica del almacenamiento de Firebase. Según Google Storage, las carpetas no existen, sino que son convenciones de nomenclatura. De todos modos, logré hacer esto (sin guardar la ruta completa de cada archivo en la base de datos) agregando { prefix: ${folderName}, autoPaginate: false }
dentro de la getFiles
llamada de función lo siguiente:
...
const getFileNames = (folderName: string) => {
admin.storage().bucket().getFiles({ prefix: `${folderName}`, autoPaginate: false })
.then(([files]: any) => {
...