¿Cómo obtener una lista de todos los archivos en Cloud Storage en una aplicación Firebase?

Resuelto Luis Ruiz Figueroa asked hace 54 años • 20 respuestas

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.

Luis Ruiz Figueroa avatar Jan 01 '70 08:01 Luis Ruiz Figueroa
Aceptado

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.

Frank van Puffelen avatar May 20 '2016 03:05 Frank van Puffelen

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.jsque require("firebase/app");no volverá firebase.storage()como una función. Esto sólo se logra usando import * as firebase from 'firebase/app';.

Rosário Pereira Fernandes avatar May 31 '2019 21:05 Rosário Pereira Fernandes

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

johnozbay avatar Apr 10 '2017 11:04 johnozbay

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.

Mike McDonald avatar Aug 16 '2016 14:08 Mike McDonald

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 getFilesllamada de función lo siguiente:

...
const getFileNames = (folderName: string) => {
  admin.storage().bucket().getFiles({ prefix: `${folderName}`, autoPaginate: false })
    .then(([files]: any) => {
    ...
Berci avatar Oct 30 '2020 08:10 Berci