Cloud Storage for Firebase позволяет перечислять содержимое корзины Cloud Storage. SDK возвращают как элементы, так и префиксы объектов, относящихся к текущей ссылке Cloud Storage.
Для проектов, в которых используется API списков, требуется Cloud Storage for Firebaseверсии 2. Если у вас уже есть проект Firebase, следуйте инструкциям из руководства по правилам безопасности.
list() использует Google Cloud Storage List API.
В Cloud Storage for Firebase мы используем / в качестве разделителя, что позволяет нам эмулировать семантику файловой системы. Чтобы обеспечить эффективный переход по большим иерархическим сегментам Cloud Storage, API List возвращает префиксы и элементы отдельно. Например, если вы загрузите файл /images/uid/file1,
root.child('images').listAll()вернет/images/uidв качестве префикса.root.child('images/uid').listAll()вернет файл в виде объекта.
SDK Cloud Storage for Firebase не возвращает пути к объектам, которые содержат два последовательных символа / или заканчиваются символом /.. Например, в корзине есть следующие объекты:
correctPrefix/happyItemwrongPrefix//sadItemlonelyItem/
Операции со списком объектов в этом сегменте дадут следующие результаты:
- Операция list в корневом каталоге возвращает ссылки на
correctPrefix,wrongPrefixиlonelyItemкакprefixes. - Операция со списком в
correctPrefix/возвращает ссылки наcorrectPrefix/happyItemкакitems. - Операция списка в
wrongPrefix/не возвращает никаких ссылок, посколькуwrongPrefix//sadItemсодержит два последовательных символа/. - Операция со списком в
lonelyItem/не возвращает никаких ссылок, поскольку объектlonelyItem/заканчивается на/.
Как получить список всех файлов
Вы можете использовать listAll(completion:), чтобы получить все результаты для каталога.
Этот метод лучше всего подходит для небольших каталогов, поскольку все результаты буферизуются в памяти.
Кроме того, операция может не вернуть согласованный снимок, если во время процесса объекты добавляются или удаляются.
Если список большой, используйте метод list(withMaxResults:completion:) с разбивкой на страницы, поскольку listAll(completion:) сохраняет все результаты в памяти.
В следующем примере показано, как использовать listAll(completion:).
Swift
let storageReference = storage.reference().child("files/uid") do { let result = try await storageReference.listAll() for prefix in result.prefixes { // The prefixes under storageReference. // You may call listAll(completion:) recursively on them. } for item in result.items { // The items under storageReference. } } catch { // ... }
Objective-C
FIRStorageReference *storageReference = [storage reference]; [storageReference listAllWithCompletion:^(FIRStorageListResult *result, NSError *error) { if (error != nil) { // ... } for (FIRStorageReference *prefix in result.prefixes) { // All the prefixes under storageReference. // You may call listAllWithCompletion: recursively on them. } for (FIRStorageReference *item in result.items) { // All items under storageReference. } }];
Как разбить результаты списка на страницы
В API list(withMaxResults:completion:) действует ограничение на количество возвращаемых результатов. list(withMaxResults:completion) обеспечивает согласованный просмотр страницы и предоставляет токен pageToken, который позволяет контролировать, когда нужно получать дополнительные результаты.
Параметр pageToken содержит путь и версию последнего элемента, возвращенного в предыдущем результате. В последующем запросе с использованием pageToken будут показаны объекты, которые идут после pageToken.
В примере ниже показано, как разбить результаты на страницы:
Swift
func listAllPaginated(pageToken: String? = nil) async throws { let storage = Storage.storage() let storageReference = storage.reference().child("files/uid") let listResult: StorageListResult if let pageToken = pageToken { listResult = try await storageReference.list(maxResults: 100, pageToken: pageToken) } else { listResult = try await storageReference.list(maxResults: 100) } let prefixes = listResult.prefixes let items = listResult.items // Handle list result // ... // Process next page if let token = listResult.pageToken { try await listAllPaginated(pageToken: token) } }
Objective-C
- (void)paginateFilesAtReference:(FIRStorageReference *)reference pageToken:(nullable NSString *)pageToken { void (^pageHandler)(FIRStorageListResult *_Nonnull, NSError *_Nullable) = ^(FIRStorageListResult *result, NSError *error) { if (error != nil) { // ... } NSArray *prefixes = result.prefixes; NSArray *items = result.items; // ... // Process next page if (result.pageToken != nil) { [self paginateFilesAtReference:reference pageToken:result.pageToken]; } }; if (pageToken != nil) { [reference listWithMaxResults:100 pageToken:pageToken completion:pageHandler]; } else { [reference listWithMaxResults:100 completion:pageHandler]; } }
Обработка ошибок
Методы API списка не будут работать, если вы не обновите правила безопасности до версии 2. Если вы видите эту ошибку, обновите правила безопасности:
Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.
Другие возможные ошибки могут указывать на то, что у пользователя нет необходимых разрешений. Дополнительную информацию об ошибках можно найти в разделе Обработка ошибок.