Cloud Storage for Firebase 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 la versione 2 delle regole Cloud Storage for Firebase. 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, il che ci consente di
emulare la semantica del file system. Per consentire l'attraversamento efficiente di bucket Cloud Storage di grandi dimensioni e gerarchici, l'API List restituisce separatamente prefissi e 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 degli oggetti che contengono due
/
consecutivi o che terminano con un /.
. 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
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 alcun riferimento perché l'oggettolonelyItem/
termina con/
.
Elenca tutti i file
Puoi utilizzare listAll
per recuperare tutti i risultati di una directory.
È ideale per directory di piccole dimensioni, poiché tutti i risultati vengono memorizzati nel buffer in memoria.
L'operazione potrebbe anche 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, in quanto listAll()
memorizza nel buffer tutti i risultati.
L'esempio seguente mostra listAll
.
Web
import { getStorage, ref, listAll } from "firebase/storage"; const storage = getStorage(); // Create a reference under which you want to list const listRef = ref(storage, 'files/uid'); // Find all the prefixes and items. listAll(listRef) .then((res) => { res.prefixes.forEach((folderRef) => { // All the prefixes under listRef. // You may call listAll() recursively on them. }); res.items.forEach((itemRef) => { // All the items under listRef. }); }).catch((error) => { // Uh-oh, an error occurred! });
Web
// Create a reference under which you want to list var listRef = storageRef.child('files/uid'); // Find all the prefixes and items. listRef.listAll() .then((res) => { res.prefixes.forEach((folderRef) => { // All the prefixes under listRef. // You may call listAll() recursively on them. }); res.items.forEach((itemRef) => { // All the items under listRef. }); }).catch((error) => { // Uh-oh, an error occurred! });
Impagina i risultati dell'elenco
L'API list()
impone un limite al numero di risultati restituiti. list()
fornisce una visualizzazione di pagina 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 pageToken, vengono mostrati gli elementi che seguono pageToken.
L'esempio seguente mostra la paginazione di un risultato utilizzando async/await
.
Web
import { getStorage, ref, list } from "firebase/storage"; async function pageTokenExample(){ // Create a reference under which you want to list const storage = getStorage(); const listRef = ref(storage, 'files/uid'); // Fetch the first page of 100. const firstPage = await list(listRef, { maxResults: 100 }); // Use the result. // processItems(firstPage.items) // processPrefixes(firstPage.prefixes) // Fetch the second page if there are more elements. if (firstPage.nextPageToken) { const secondPage = await list(listRef, { maxResults: 100, pageToken: firstPage.nextPageToken, }); // processItems(secondPage.items) // processPrefixes(secondPage.prefixes) } }
Web
async function pageTokenExample(){ // Create a reference under which you want to list var listRef = storageRef.child('files/uid'); // Fetch the first page of 100. var firstPage = await listRef.list({ maxResults: 100}); // Use the result. // processItems(firstPage.items) // processPrefixes(firstPage.prefixes) // Fetch the second page if there are more elements. if (firstPage.nextPageToken) { var secondPage = await listRef.list({ maxResults: 100, pageToken: firstPage.nextPageToken, }); // processItems(secondPage.items) // processPrefixes(secondPage.prefixes) } }
Gestisci gli errori
list()
e listAll()
restituiscono una promessa rifiutata se non hai eseguito l'upgrade
delle regole di sicurezza alla versione 2. Aggiorna le 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. Per maggiori informazioni sugli errori, consulta la sezione Gestire gli errori.