Listar archivos con Cloud Storage en plataformas Apple

Cloud Storage para Firebase le permite enumerar el contenido de su depósito de Cloud Storage. Los SDK devuelven tanto los elementos como los prefijos de los objetos bajo la referencia actual de Cloud Storage.

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

list() utiliza la API de lista de Google Cloud Storage . En Cloud Storage para Firebase, usamos / como delimitador, lo que nos permite emular la semántica del sistema de archivos. Para permitir un recorrido eficiente de depósitos grandes y jerárquicos de Cloud Storage, la API List devuelve prefijos y elementos por separado. Por ejemplo, si carga un archivo /images/uid/file1 ,

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

El SDK de Cloud Storage para Firebase no devuelve rutas de objetos que contengan dos / so consecutivos o terminen con un /. . Por ejemplo, considere un depósito que tiene los siguientes objetos:

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

Las operaciones de lista en elementos de este depósito darán los siguientes resultados:

  • La operación de lista en la raíz devuelve las referencias a correctPrefix , wrongPrefix y lonelyItem como prefixes .
  • La operación de lista en correctPrefix/ devuelve las referencias a correctPrefix/happyItem como items .
  • La operación de lista en wrongPrefix/ no devuelve ninguna referencia porque wrongPrefix//sadItem contiene dos / s consecutivos.
  • La operación de lista en lonelyItem/ no devuelve ninguna referencia porque el objeto lonelyItem/ termina con / .

Listar todos los archivos

Puede utilizar listAll(completion:) para obtener todos los resultados de un directorio. Esto se utiliza mejor para directorios pequeños ya que todos los resultados se almacenan en la memoria intermedia. Es posible que la operación tampoco devuelva una instantánea coherente si se agregan o eliminan objetos durante el proceso.

Para una lista grande, utilice el método list(withMaxResults:completion:) paginado ya que listAll(completion:) almacena todos los resultados en la memoria.

El siguiente ejemplo demuestra listAll(completion:) .

Rápido

let storageReference = storage.reference().child("files/uid")
do {
  let result = try await storageReference.listAll()
  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.
  }
} catch {
  // ...
}

C objetivo

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.
  }
}];

Paginar resultados de la lista

La list(withMaxResults:completion:) impone un límite a la cantidad de resultados que devuelve. list(withMaxResults:completion) proporciona una vista de página consistente y expone un pageToken que permite controlar cuándo obtener resultados adicionales.

El pageToken codifica la ruta y la versión del último elemento devuelto en el resultado anterior. En una solicitud posterior que utiliza el pageToken, se muestran los elementos que vienen después del pageToken.

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

Rápido

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

  let listResult: StorageListResult
  if let pageToken = pageToken {
    listResult = try await storageReference.list(maxResults: 100, pageToken: pageToken)
  } else {
    listResult = try await storageReference.list(maxResults: 100)
  }
  let prefixes = listResult.prefixes
  let items = listResult.items
  // Handle list result
  // ...

  // Process next page
  if let token = listResult.pageToken {
    try await listAllPaginated(pageToken: token)
  }
}

C objetivo

- (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];
  }
}

Manejar errores

Los métodos de la API de la lista fallarán si no ha actualizado sus Reglas de seguridad a la versión 2. Actualice sus Reglas de seguridad si ve este 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 posibles errores pueden indicar que el usuario no tiene los permisos adecuados. Puede encontrar más información sobre errores en Manejar errores .