Cloud Storage dla Firebase umożliwia wyświetlenie zawartości zasobnika Cloud Storage. Pakiety SDK zwracają zarówno elementy, jak i przedrostki obiektów w ramach bieżącego odniesienia do Cloud Storage.
Projekty korzystające z interfejsu List API wymagają Cloud Storage for Firebase Rules w wersji 2. Jeśli masz istniejący projekt Firebase, wykonaj czynności opisane w Przewodniku po regułach bezpieczeństwa .
list()
korzysta z interfejsu API listy Google Cloud Storage . W Cloud Storage dla Firebase używamy /
jako separatora, co pozwala nam emulować semantykę systemu plików. Aby umożliwić efektywne przeglądanie dużych, hierarchicznych segmentów Cloud Storage, interfejs API listy zwraca oddzielnie prefiksy i elementy. Na przykład, jeśli prześlesz jeden plik /images/uid/file1
,
-
root.child('images').listAll()
zwróci/images/uid
jako przedrostek. -
root.child('images/uid').listAll()
zwróci plik jako element.
Pakiet Cloud Storage for Firebase SDK nie zwraca ścieżek obiektów zawierających dwa kolejne znaki /
lub kończących się znakiem /
. Rozważmy na przykład wiadro zawierające następujące obiekty:
-
correctPrefix/happyItem
-
wrongPrefix//sadItem
-
lonelyItem/
Operacje listowe na elementach w tym segmencie dadzą następujące wyniki:
- Operacja list w katalogu głównym zwraca odniesienia do
correctPrefix
,wrongPrefix
ilonelyItem
w postaciprefixes
. - Operacja listowa na
correctPrefix/
zwraca odniesienia docorrectPrefix/happyItem
jakoitems
. - Operacja listowa pod
wrongPrefix/
nie zwraca żadnych odniesień, ponieważwrongPrefix//sadItem
zawiera dwa kolejne/
s. - Operacja listowa na
lonelyItem/
nie zwraca żadnych referencji, ponieważ obiektlonelyItem/
kończy się na/
.
Lista wszystkich plików
Możesz użyć listAll
, aby pobrać wszystkie wyniki dla katalogu. Najlepiej jest to stosować w przypadku małych katalogów, ponieważ wszystkie wyniki są buforowane w pamięci. Operacja może również nie zwrócić spójnej migawki, jeśli w trakcie procesu zostaną dodane lub usunięte obiekty.
W przypadku dużej listy użyj metody list()
z podziałem na strony, ponieważ listAll()
buforuje wszystkie wyniki w pamięci.
Poniższy przykład ilustruje 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.
}
Wyniki listy stronicowania
Funkcja API list()
nakłada ograniczenie liczby zwracanych wyników. list()
zapewnia spójną odsłonę strony i udostępnia pageToken, który pozwala kontrolować, kiedy pobrać dodatkowe wyniki.
PageToken koduje ścieżkę i wersję ostatniego elementu zwróconego w poprzednim wyniku. W kolejnym żądaniu wykorzystującym pageToken wyświetlane są elementy następujące po pageToken.
Poniższy przykład ilustruje paginację wyniku:
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);
}
Obsługuj błędy
list()
i listAll()
nie działają, jeśli nie zaktualizowałeś reguł bezpieczeństwa do wersji 2. Zaktualizuj reguły bezpieczeństwa, jeśli widzisz ten błąd:
Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.
Inne możliwe błędy mogą wskazywać, że użytkownik nie ma odpowiednich uprawnień. Więcej informacji na temat błędów można znaleźć na stronie Obsługa błędów .