Cloud Storage para Firebase le permite enumerar el contenido de su depósito de Cloud Storage. Los SDK devuelven tanto los elementos como los prefijos de los objetos bajo la referencia actual de Cloud Storage.
Los proyectos que usan List API requieren Cloud Storage para Firebase Rules versión 2. Si tienes un proyecto de Firebase existente, sigue los pasos de la Guía de reglas de seguridad .
list()
utiliza la API de lista de Google Cloud Storage . En Cloud Storage para Firebase, usamos /
como delimitador, lo que nos permite emular la semántica del sistema de archivos. Para permitir un recorrido eficiente de depósitos grandes y jerárquicos de Cloud Storage, la API List devuelve prefijos y elementos por separado. Por ejemplo, si carga un archivo /images/uid/file1
,
-
root.child('images').listAll()
devolverá/images/uid
como prefijo. -
root.child('images/uid').listAll()
devolverá el archivo como un elemento.
El SDK de Cloud Storage para Firebase no devuelve rutas de objetos que contengan dos /
so consecutivos o terminen con un /.
. Por ejemplo, considere un depósito que tiene los siguientes objetos:
-
correctPrefix/happyItem
-
wrongPrefix//sadItem
-
lonelyItem/
Las operaciones de lista en elementos de este depósito darán los siguientes resultados:
- La operación de lista en la raíz devuelve las referencias a
correctPrefix
,wrongPrefix
ylonelyItem
comoprefixes
. - La operación de lista en
correctPrefix/
devuelve las referencias acorrectPrefix/happyItem
comoitems
. - La operación de lista en
wrongPrefix/
no devuelve ninguna referencia porquewrongPrefix//sadItem
contiene dos/
s consecutivos. - La operación de lista en
lonelyItem/
no devuelve ninguna referencia porque el objetolonelyItem/
termina con/
.
Listar todos los archivos
Puede utilizar listAll
para recuperar todos los resultados de un directorio. Esto se utiliza mejor para directorios pequeños ya que todos los resultados se almacenan en la memoria intermedia. Es posible que la operación tampoco devuelva una instantánea coherente si se agregan o eliminan objetos durante el proceso.
Para una lista grande, use el método list()
paginado ya que listAll()
almacena todos los resultados en la memoria.
El siguiente ejemplo demuestra 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! });
Paginar resultados de la lista
La API list()
impone un límite a la cantidad de resultados que devuelve. list()
proporciona una vista de página consistente y expone un pageToken que permite controlar cuándo obtener resultados adicionales.
El pageToken codifica la ruta y la versión del último elemento devuelto en el resultado anterior. En una solicitud posterior que utiliza el pageToken, se muestran los elementos que vienen después del pageToken.
El siguiente ejemplo demuestra la paginación de un resultado usando 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) } }
Manejar errores
list()
y listAll()
devuelven una Promesa rechazada si no ha actualizado las Reglas de seguridad a la versión 2. Actualice sus Reglas de seguridad si ve este error:
Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.
Otros posibles errores pueden indicar que el usuario no tiene el permiso adecuado. Puede encontrar más información sobre errores en Manejar errores .