Cloud Storage for Firebase vous permet de lister le contenu de votre bucket Cloud Storage. Les SDK renvoient à la fois les éléments et les préfixes des objets sous la référence Cloud Storage actuelle.
Les projets qui utilisent l'API List nécessitent la version 2 des règles Cloud Storage for Firebase. Si vous avez déjà un projet Firebase, suivez les étapes du guide sur les règles de sécurité.
list() utilise l'API List Google Cloud Storage.
Dans Cloud Storage for Firebase, nous utilisons / comme délimiteur, ce qui nous permet d'émuler la sémantique du système de fichiers. Pour permettre un parcours efficace des grands buckets Cloud Storage hiérarchiques, l'API List renvoie les préfixes et les éléments séparément. Par exemple, si vous importez un fichier /images/uid/file1,
root.child('images').listAll()renverra/images/uidcomme préfixe.root.child('images/uid').listAll()renvoie le fichier en tant qu'élément.
Le SDK Cloud Storage for Firebase ne renvoie pas de chemins d'accès d'objets contenant deux / consécutifs ou se terminant par un /.. Par exemple, prenons un bucket contenant les objets suivants :
correctPrefix/happyItemwrongPrefix//sadItemlonelyItem/
Les opérations de liste sur les éléments de ce bucket donneront les résultats suivants :
- L'opération de liste à la racine renvoie les références à
correctPrefix,wrongPrefixetlonelyItemen tant queprefixes. - L'opération de liste au niveau de
correctPrefix/renvoie les références àcorrectPrefix/happyItemsous la formeitems. - L'opération de liste au niveau de
wrongPrefix/ne renvoie aucune référence, carwrongPrefix//sadItemcontient deux/consécutifs. - L'opération de liste au niveau de
lonelyItem/ne renvoie aucune référence, car l'objetlonelyItem/se termine par/.
Lister tous les fichiers
Vous pouvez utiliser listAll pour récupérer tous les résultats d'un répertoire.
Cette méthode est particulièrement adaptée aux petits répertoires, car tous les résultats sont mis en mémoire tampon.
L'opération peut également ne pas renvoyer un instantané cohérent si des objets sont ajoutés ou supprimés au cours du processus.
Pour une liste volumineuse, utilisez la méthode paginée list(), car listAll() met en mémoire tampon tous les résultats en mémoire.
L'exemple suivant illustre 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! });
Paginer les résultats d'une liste
L'API list() limite le nombre de résultats qu'elle renvoie. list() fournit une vue de page cohérente et expose un pageToken qui permet de contrôler quand récupérer des résultats supplémentaires.
Le jeton pageToken encode le chemin d'accès et la version du dernier élément renvoyé dans le résultat précédent. Dans une requête ultérieure utilisant le pageToken, les éléments qui viennent après le pageToken sont affichés.
L'exemple suivant montre comment paginer un résultat à l'aide de 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) } }
Gérer les erreurs
list() et listAll() renvoient une promesse refusée si vous n'avez pas mis à niveau les règles de sécurité vers la version 2. Mettez à niveau vos règles de sécurité si vous voyez cette erreur :
Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.
D'autres erreurs possibles peuvent indiquer que l'utilisateur ne dispose pas de l'autorisation appropriée. Pour en savoir plus sur les erreurs, consultez Gérer les erreurs.