Cloud Storage for Firebase ti 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 Cloud Storage for Firebase Regole versione 2. Se hai già un progetto Firebase, segui i passaggi descritti nella guida alle regole di sicurezza.
list()
utilizza l'Google Cloud Storage API List.
In Cloud Storage for Firebase, utilizziamo /
come delimitatore, che consente di emulare la semantica del file system. Per consentire un'esplorazione efficiente di bucket Cloud Storage grandi e gerarchici, l'API List restituisce i prefissi e gli elementi distintamente. 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 degli oggetti che contengono due /
consecutivi o terminano con un /.
. Ad esempio, considera un bucket con i seguenti oggetti:
correctPrefix/happyItem
wrongPrefix//sadItem
lonelyItem/
Le operazioni di elenco sugli elementi di questo bucket daranno i seguenti risultati:
- L'operazione di elenco nella directory principale restituisce i riferimenti a
correctPrefix
,wrongPrefix
elonelyItem
comeprefixes
. - L'operazione di elenco in
correctPrefix/
restituisce i riferimenti acorrectPrefix/happyItem
comeitems
. - L'operazione di elenco in
wrongPrefix/
non restituisce alcun riferimento perchéwrongPrefix//sadItem
contiene due/
consecutivi. - L'operazione di elenco in
lonelyItem/
non restituisce riferimenti perché l'oggettolonelyItem/
termina con/
.
Elenca tutti i file
Puoi utilizzare listAll(completion:)
per recuperare tutti i risultati per una directory.
Questo metodo è ideale per directory di piccole dimensioni, poiché tutti i risultati vengono memorizzati nella 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, usa il metodo list(withMaxResults:completion:)
impaginato, poiché listAll(completion:)
memorizza 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. } }];
Eseguire la paginazione dei risultati dell'elenco
L'API list(withMaxResults:completion:)
impone un limite al numero di risultati che restituisce. list(withMaxResults:completion)
fornisce una pagina visualizzata coerente ed espone un pageToken che consente di controllare quando recuperare risultati aggiuntivi.
pageToken codifica il percorso e la versione dell'ultimo elemento restituito nel risultato precedente. In una richiesta successiva che utilizza il token pageToken, vengono visualizzati gli elementi che si trovano dopo il token pageToken.
L'esempio seguente mostra l'impaginazione di 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]; } }
Gestire gli errori
I metodi nell'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 viene visualizzato 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 necessarie. Puoi trovare maggiori informazioni sugli errori in Gestire gli errori.