Cloud Storage for Firebase позволяет просматривать содержимое контейнера Cloud Storage . SDK возвращают как элементы, так и префиксы объектов в текущей ссылке Cloud Storage .
Для проектов, использующих API списков, требуются Cloud Storage for Firebase версии 2. Если у вас есть существующий проект Firebase, следуйте инструкциям в Руководстве по правилам безопасности .
list() использует API Google Cloud Storage List . В Cloud Storage for Firebase мы используем / в качестве разделителя, что позволяет эмулировать семантику файловой системы. Для эффективного обхода больших иерархических контейнеров Cloud Storage API List возвращает префиксы и элементы отдельно. Например, если вы загружаете один файл /images/uid/file1 ,
-
root.child('images').listAll()вернет/images/uidв качестве префикса. -
root.child('images/uid').listAll()вернет файл как элемент.
Cloud Storage for Firebase SDK не возвращает пути к объектам, содержащие два последовательных символа / или заканчивающиеся на /. Например, рассмотрим контейнер, содержащий следующие объекты:
-
correctPrefix/happyItem -
wrongPrefix//sadItem -
lonelyItem/
Операции со списком элементов в этом контейнере дадут следующие результаты:
- Операция со списком в корне возвращает ссылки на
correctPrefix,wrongPrefixиlonelyItemв качествеprefixes. - Операция списка
correctPrefix/возвращает ссылки наcorrectPrefix/happyItemкакitems. - Операция со списком в
wrongPrefix/не возвращает никаких ссылок, посколькуwrongPrefix//sadItemсодержит два последовательных символа/. - Операция со списком в
lonelyItem/не возвращает никаких ссылок, поскольку объектlonelyItem/заканчивается на/.
Список всех файлов
Вы можете использовать listAll(completion:) для извлечения всех результатов из каталога. Этот метод лучше всего подходит для небольших каталогов, поскольку все результаты буферизуются в памяти. Кроме того, операция может не возвращать согласованный снимок, если в процессе добавляются или удаляются объекты.
Для большого списка используйте метод paginated list(withMaxResults:completion:) поскольку listAll(completion:) буферизует все результаты в памяти.
Следующий пример демонстрирует listAll(completion:) .
Быстрый
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.
В следующем примере демонстрируется разбиение результата на страницы:
Быстрый
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.
Другие возможные ошибки могут указывать на отсутствие у пользователя необходимых прав. Подробнее об ошибках можно узнать в разделе «Обработка ошибок» .