Cloud Storage for Firebase consente di elencare i contenuti del Cloud Storage bucket. Gli SDK restituiscono sia gli elementi sia i prefissi degli oggetti nel riferimento Cloud Storage corrente.
I progetti che utilizzano l'API list richiedono la versione 2 delle regole di sicurezza di Cloud Storage for Firebase. Se hai già un progetto Firebase, segui i passaggi descritti in nella Guida alle regole di sicurezza.
list() uses the
Google Cloud Storage List API.
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 gerarchici di grandi dimensioni,
Cloud Storage l'API List restituisce prefissi ed elementi
separatamente. Ad esempio, se carichi un file /images/uid/file1,
root.child('images').listAll()restituirà/images/uidcome prefisso.root.child('images/uid').listAll()restituirà il file come elemento.
L'Cloud Storage for Firebase SDK non restituisce percorsi di oggetti che contengono due
/ consecutivi o che terminano con un /.. Ad esempio, considera un bucket che contiene i
seguenti oggetti:
correctPrefix/happyItemwrongPrefix//sadItemlonelyItem/
Le operazioni di elenco sugli elementi in questo bucket daranno i seguenti risultati:
- L'operazione di elenco nella radice restituisce i riferimenti a
correctPrefix,wrongPrefixelonelyItemcomeprefixes. - L'operazione di elenco in
correctPrefix/restituisce i riferimenti acorrectPrefix/happyItemcomeitems. - L'operazione di elenco in
wrongPrefix/non restituisce alcun riferimento perchéwrongPrefix//sadItemcontiene due/consecutivi. - L'operazione di elenco in
lonelyItem/non restituisce alcun riferimento perché l'oggettolonelyItem/termina con/.
Elenca tutti i file
Puoi utilizzare listAll(completion:) 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 con impaginazione list(withMaxResults:completion:) poiché
listAll(completion:) memorizza nel buffer tutti i risultati in memoria.
L'esempio seguente mostra listAll(completion:).
Swift
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 { // ... }
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. } }];
Impagina i risultati dell'elenco
L'API list(withMaxResults:completion:) impone un limite al numero di
risultati che restituisce. list(withMaxResults:completion) 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:
Swift
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) } }
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]; } }
Gestisci gli errori
I metodi dell'API list non funzioneranno 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 delle autorizzazioni corrette. Per ulteriori informazioni sugli errori, consulta la sezione Gestisci gli errori.