Cloud Storage pour Firebase vous permet de lister le contenu de votre bucket Cloud Storage. Les SDK renvoient à la fois les éléments et les préfixes de dans la documentation de référence sur Cloud Storage actuelle.
Les projets qui utilisent l'API List nécessitent Cloud Storage pour la version 2 de Firebase Rules. Si vous avez déjà un projet Firebase, suivez les étapes décrites dans la section le Guide sur les règles de sécurité.
list()
utilise les
API Google Cloud Storage List :
Dans Cloud Storage for Firebase, nous utilisons /
comme séparateur, 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 importez un fichier /images/uid/file1
,
root.child('images').listAll()
renvoie/images/uid
en tant que 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'objet contenant deux /
consécutifs ou se terminant par un /
. Prenons l'exemple d'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
etlonelyItem
sous la formeprefixes
. - L'opération de liste au niveau de
correctPrefix/
renvoie les références àcorrectPrefix/happyItem
sous la formeitems
. - L'opération de liste au niveau de
wrongPrefix/
ne renvoie aucune référence carwrongPrefix//sadItem
contient deux valeurs/
consécutives. - L'opération de liste au niveau de
lonelyItem/
ne renvoie aucune référence, car l'objetlonelyItem/
se termine par/
.
Répertorier tous les fichiers
Vous pouvez utiliser listAll
pour récupérer tous les résultats d'un répertoire.
Il est préférable d'utiliser cette méthode pour les petits répertoires, car tous les résultats sont mis en mémoire tampon.
Il est également possible que l'opération ne renvoie pas d'instantané cohérent si des objets sont ajoutés ou
supprimés pendant le processus.
Pour une liste volumineuse, utilisez la méthode list()
avec pagination, car listAll()
met tout en mémoire tampon
en mémoire.
L'exemple suivant illustre listAll
.
final storageRef = FirebaseStorage.instance.ref().child("files/uid");
final listResult = await storageRef.listAll();
for (var prefix in listResult.prefixes) {
// The prefixes under storageRef.
// You can call listAll() recursively on them.
}
for (var item in listResult.items) {
// The items under storageRef.
}
Paginer les résultats d'une liste
L'API list()
limite le nombre de résultats qu'elle renvoie. list()
fournit une page vue cohérente et expose un pageToken qui permet de contrôler
quand récupérer des résultats supplémentaires.
Le 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 suivent le pageToken sont affichés.
L'exemple suivant illustre la pagination d'un résultat:
Stream<ListResult> listAllPaginated(Reference storageRef) async* {
String? pageToken;
do {
final listResult = await storageRef.list(ListOptions(
maxResults: 100,
pageToken: pageToken,
));
yield listResult;
pageToken = listResult.nextPageToken;
} while (pageToken != null);
}
Gérer les erreurs
Échec de list()
et listAll()
si vous n'avez pas effectué la mise à 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 des autorisations appropriées. Pour en savoir plus sur les erreurs, consultez Gérer les erreurs. .