Elenca i file con Cloud Storage su Flutter

Cloud Storage for Firebase ti consente di elencare i contenuti del bucket Cloud Storage. Gli SDK restituiscono sia gli elementi sia i prefissi degli oggetti nel riferimento Cloud Storage corrente.

I progetti che utilizzano l'API List richiedono Cloud Storage for Firebase Rules versione 2. Se hai già un progetto Firebase, segui i passaggi descritti in nella Guida alle regole di sicurezza.

list() utilizza l' API List di Google Cloud Storage. In Cloud Storage for Firebase, utilizziamo / come delimitatore, il che ci consente di emulare la semantica del file system. Per consentire l'attraversamento efficiente di bucket Cloud Storage gerarchici di grandi dimensioni, l'API List restituisce separatamente prefissi ed elementi. Ad esempio, se carichi un file /images/uid/file1,

  • root.child('images').listAll() restituirà /images/uid come prefisso.
  • root.child('images/uid').listAll() restituirà il file come elemento.

L'SDK Cloud Storage for Firebase non restituisce percorsi di oggetti che contengono due / consecutivi o che terminano con /. Ad esempio, considera un bucket con i seguenti oggetti:

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

Le operazioni di elenco sugli elementi in questo bucket daranno i seguenti risultati:

  • L'operazione di elenco nella radice restituisce i riferimenti a correctPrefix, wrongPrefix e lonelyItem come prefixes.
  • L'operazione di elenco in correctPrefix/ restituisce i riferimenti a correctPrefix/happyItem come items.
  • L'operazione di elenco in wrongPrefix/ non restituisce alcun riferimento perché wrongPrefix//sadItem contiene due / consecutivi.
  • L'operazione di elenco in lonelyItem/ non restituisce alcun riferimento perché l'oggetto lonelyItem/ termina con /.

Elenca tutti i file

Puoi utilizzare listAll per recuperare tutti i risultati di una directory. È consigliabile utilizzare questa opzione per le directory di piccole dimensioni, poiché tutti i risultati vengono memorizzati nel buffer in memoria. Inoltre, l'operazione potrebbe non restituire uno snapshot coerente se gli oggetti vengono aggiunti o rimossi durante il processo.

Per un elenco di grandi dimensioni, utilizza il metodo list() paginato, poiché listAll() memorizza nel buffer tutti i risultati in memoria.

L'esempio seguente mostra 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.
}

Impagina i risultati dell'elenco

L'API list() impone un limite al numero di risultati che restituisce. list() fornisce una visualizzazione di pagina coerente ed espone un pageToken che consente di controllare quando recuperare risultati aggiuntivi.

Il pageToken codifica il percorso e la versione dell'ultimo elemento restituito nel risultato precedente. In una richiesta successiva che utilizza il pageToken, vengono visualizzati gli elementi che seguono il pageToken.

L'esempio seguente mostra come impaginare un risultato:

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);
}

Gestisci gli errori

list() e listAll() non riescono se non hai eseguito l'upgrade delle regole di sicurezza alla versione 2. Esegui l'upgrade delle regole di sicurezza se visualizzi questo errore:

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

Altri possibili errori potrebbero indicare che l'utente non dispone dell'autorizzazione corretta. Puoi trovare ulteriori informazioni sugli errori nella pagina Gestisci gli errori.