Muestra una lista de archivos en iOS

Cloud Storage te permite mostrar una lista del contenido en el depósito de Storage. Los SDK muestran los elementos y los prefijos de los objetos que se encuentran en la referencia de Storage actual.

Los proyectos que usan la API de List requieren la versión 2 de las reglas de Firebase Storage. Si tienes un proyecto de Firebase existente, sigue los pasos de la Guía sobre reglas de seguridad.

Esta API utiliza la API de List de Google Cloud Storage. En Firebase Storage, se usa / como delimitador, lo que permite emular la semántica del sistema de archivos. Para permitir un recorrido eficiente de depósitos de Storage jerárquicos y de gran tamaño, la API de List muestra los prefijos y los elementos por separado. Por ejemplo, si subes un archivo /images/uid/file1, ocurrirá lo siguiente:

  • root.child('images').listAll() mostrará /images/uid como un prefijo.
  • root.child('images/uid').listAll() mostrará el archivo como un elemento.

El SDK de Firebase Storage no muestra las rutas de acceso de los objetos que contienen dos / consecutivos o que terminan en /.. Por ejemplo, supongamos que un depósito tiene los siguientes objetos:

  • correctPrefix/happyItem
  • wrongPrefix//sadItem
  • lonelyItem/

Las operaciones de lista que se realicen en este depósito mostrarán los siguientes resultados:

  • Las que se realicen en la raíz mostrarán las referencias a correctPrefix, wrongPrefix y lonelyItem como prefixes.
  • Las que se realicen en correctPrefix/ mostrarán las referencias a correctPrefix/happyItem como items.
  • Las que se realicen en wrongPrefix/ no mostrarán ninguna referencia porque wrongPrefix//sadItem contiene dos / consecutivos.
  • Las que se realicen en lonelyItem/ no mostrarán ninguna referencia porque el objeto  termina en /.

Muestra una lista de todos los archivos

Puedes usar listAll(completion:) para obtener todos los resultados de un directorio. Se recomienda usarlo con directorios pequeños, ya que los resultados se almacenan en un búfer de la memoria. También es posible que la operación no muestre una instantánea coherente si se agregan o quitan objetos durante el proceso.

En el caso de una lista de gran tamaño, usa el método paginado list(withMaxResults:completion:), ya que listAll(completion:) almacena todos los resultados en un búfer de la memoria.

En el siguiente ejemplo, se muestra el funcionamiento de listAll(completion:).

Swift

let storageReference = storage.reference().child("files/uid")
storageReference.listAll { (result, error) in
  if let error = error {
    // ...
  }
  for prefix in result.prefixes {
    // The prefixes under storageReference.
    // You may call listAll(completion:) recursively on them.
  }
  for item in result.items {
    // The items under storageReference.
  }
}

Objective-C

FIRStorageReference *storageReference = [storage reference];
[storageReference listAllWithCompletion:^(FIRStorageListResult *result, NSError *error) {
  if (error != nil) {
    // ...
  }

  for (FIRStorageReference *prefix in result.prefixes) {
    // All the prefixes under storageReference.
    // You may call listAllWithCompletion: recursively on them.
  }
  for (FIRStorageReference *item in result.items) {
    // All items under storageReference.
  }
}];

Muestra una lista paginada de resultados

La API de list(withMaxResults:completion:) impone un límite para la cantidad de resultados que se muestran. list(withMaxResults:completion) proporciona una vista de página coherente y expone un pageToken que permite controlar el momento en que se deben recuperar más resultados.

El pageToken codifica la ruta de acceso y la versión del último elemento que se mostró en el resultado anterior. Si se realiza una solicitud posterior con el pageToken, se mostrarán los elementos que vienen después de él.

El siguiente ejemplo muestra la paginación de un resultado:

Swift

func listAllPaginated(pageToken: String? = nil) {
  let storage = Storage.storage()
  let storageReference = storage.reference().child("files/uid")

  let pageHandler: (StorageListResult, Error?) -> Void = { (result, error) in
    if let error = error {
      // ...
    }
    let prefixes = result.prefixes
    let items = result.items

    // ...

    // Process next page
    if let token = result.pageToken {
      self.listAllPaginated(pageToken: token)
    }
  }

  if let pageToken = pageToken {
    storageReference.list(withMaxResults: 100, pageToken: pageToken, completion: pageHandler)
  } else {
    storageReference.list(withMaxResults: 100, completion: pageHandler)
  }
}

Objective-C

- (void)paginateFilesAtReference:(FIRStorageReference *)reference
                       pageToken:(nullable NSString *)pageToken {
  void (^pageHandler)(FIRStorageListResult *_Nonnull, NSError *_Nullable) =
      ^(FIRStorageListResult *result, NSError *error) {
        if (error != nil) {
          // ...
        }
        NSArray *prefixes = result.prefixes;
        NSArray *items = result.items;

        // ...

        // Process next page
        if (result.pageToken != nil) {
          [self paginateFilesAtReference:reference pageToken:result.pageToken];
        }
  };

  if (pageToken != nil) {
    [reference listWithMaxResults:100 pageToken:pageToken completion:pageHandler];
  } else {
    [reference listWithMaxResults:100 completion:pageHandler];
  }
}

Soluciona errores

Los métodos en la API de List fallarán si no actualizaste tus reglas de seguridad a la versión 2. Actualízalas si ves el siguiente error:

Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.

Otros errores posibles pueden indicar que el usuario no tiene los permisos adecuados. Para obtener más información sobre los errores, consulta el artículo sobre cómo solucionarlos.