Listar archivos con Cloud Storage en Flutter

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 List API requieren Cloud Storage para Firebase Rules versión 2. Si tienes un proyecto de Firebase existente, sigue los pasos en 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 para recuperar 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, use el método list() paginado ya que listAll() almacena todos los resultados en la memoria.

El siguiente ejemplo demuestra listAll .

final storageRef = FirebaseStorage.instance.ref().child("files/uid");
final listResult = await storageRef.listAll();
for (var prefix in listResult.prefixes) {
  // The prefixes under storageRef.
  // You can call listAll() recursively on them.
}
for (var item in listResult.items) {
  // The items under storageRef.
}

Paginar resultados de la lista

La API list() impone un límite a la cantidad de resultados que devuelve. list() 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:

Stream<ListResult> listAllPaginated(Reference storageRef) async* {
  String? pageToken;
  do {
    final listResult = await storageRef.list(ListOptions(
      maxResults: 100,
      pageToken: pageToken,
    ));
    yield listResult;
    pageToken = listResult.nextPageToken;
  } while (pageToken != null);
}

Manejar errores

list() y listAll() fallan si no ha actualizado las 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 el permiso adecuado. Puede encontrar más información sobre errores en la página Manejar errores .