Elenca i file con Cloud Storage sul web

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, il che ci 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 che contiene 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 alla radice restituisce i riferimenti a correctPrefix, wrongPrefix e lonelyItem come prefixes.
  • L'operazione di elenco in correctPrefix/ restituisce i riferimenti a correctPrefix/happyItem come items.
  • 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'oggetto lonelyItem/ termina con /.

Elenca tutti i file

Puoi utilizzare listAll 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, utilizza il metodo list() impaginato in quanto listAll() memorizza tutti i risultati nella memoria.

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!
  });

Eseguire la paginazione dei risultati dell'elenco

L'API list() impone un limite al numero di risultati restituiti. list() fornisce una visualizzazione di pagina coerente ed espone un token pagina 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 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)
  }
}

Gestire gli errori

list() e listAll() restituiscono una promessa rifiutata 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 dell'autorizzazione corretta. Puoi trovare maggiori informazioni sugli errori in Gestire gli errori.