Répertorier les fichiers avec Cloud Storage sur le Web

Cloud Storage pour Firebase vous permet de répertorier 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 Cloud Storage pour les règles Firebase version 2. Si vous disposez d'un projet Firebase existant, suivez les étapes du Guide des règles de sécurité .

list() utilise l' API Google Cloud Storage List . Dans Cloud Storage pour Firebase, nous utilisons / comme délimiteur, ce qui nous permet d'émuler la sémantique du système de fichiers. Pour permettre une traversée efficace de grands buckets Cloud Storage hiérarchiques, l'API List renvoie les préfixes et les éléments séparément. Par exemple, si vous téléchargez un fichier /images/uid/file1 ,

  • root.child('images').listAll() renverra /images/uid comme préfixe.
  • root.child('images/uid').listAll() renverra le fichier en tant qu'élément.

Le SDK Cloud Storage pour Firebase ne renvoie pas de chemins d'objet contenant deux / s consécutifs ou se terminant par un /. . Par exemple, considérons un bucket contenant les objets suivants :

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

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 , wrongPrefix et lonelyItem comme prefixes .
  • L'opération de liste au niveau de correctPrefix/ renvoie les références à correctPrefix/happyItem sous forme items .
  • L'opération de liste au niveau de wrongPrefix/ ne renvoie aucune référence car wrongPrefix//sadItem contient deux / s consécutifs.
  • L'opération de liste sur lonelyItem/ ne renvoie aucune référence car l'objet lonelyItem/ se termine par / .

Lister tous les fichiers

Vous pouvez utiliser listAll pour récupérer tous les résultats d'un répertoire. Il est préférable de l'utiliser pour les 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 grande liste, utilisez la méthode list() paginée car listAll() met en mémoire tampon tous les résultats.

L'exemple suivant illustre listAll .

Web modular API

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 namespaced API

// 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 de la liste

L'API list() impose une limite au nombre de résultats qu'elle renvoie. list() fournit une page vue cohérente et expose un pageToken qui permet de contrôler le moment où récupérer des résultats supplémentaires.

Le pageToken code le chemin 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 suivent le pageToken sont affichés.

L'exemple suivant montre la pagination d'un résultat à l'aide async/await .

Web modular API

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 namespaced API

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 rejeté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. Plus d’informations sur les erreurs peuvent être trouvées dans Gérer les erreurs .