Cloud Storage for Firebase cho phép bạn liệt kê nội dung của nhóm Cloud Storage. SDK trả về cả các mục và tiền tố của đối tượng trong tham chiếu hiện tại Cloud Storage.
Các dự án sử dụng API danh sách yêu cầu Cloud Storage for Firebase phiên bản 2. Nếu bạn có một dự án Firebase hiện có, hãy làm theo các bước trong Hướng dẫn về quy tắc bảo mật.
list() sử dụng
Google Cloud Storage API Danh sách.
Trong Cloud Storage for Firebase, chúng tôi sử dụng / làm dấu phân cách, cho phép chúng tôi
mô phỏng ngữ nghĩa của hệ thống tệp. Để cho phép duyệt hiệu quả các nhóm lớn,
có cấu trúc phân cấp Cloud Storage, API Danh sách sẽ trả về tiền tố và mục
riêng biệt. Ví dụ: nếu bạn tải một tệp /images/uid/file1 lên,
root.child('images').listAll()sẽ trả về/images/uiddưới dạng tiền tố.root.child('images/uid').listAll()sẽ trả về tệp dưới dạng một mục.
SDK Cloud Storage for Firebase không trả về đường dẫn đối tượng có chứa hai
dấu / liên tiếp hoặc kết thúc bằng /.. Ví dụ: hãy xem xét một nhóm có các đối tượng sau:
correctPrefix/happyItemwrongPrefix//sadItemlonelyItem/
Các thao tác danh sách trên các mục trong nhóm này sẽ cho kết quả như sau:
- Thao tác danh sách ở thư mục gốc trả về các tham chiếu đến
correctPrefix,wrongPrefixvàlonelyItemdưới dạngprefixes. - Thao tác danh sách tại
correctPrefix/trả về các tham chiếu đếncorrectPrefix/happyItemdưới dạngitems. - Thao tác danh sách tại
wrongPrefix/không trả về tham chiếu nào vìwrongPrefix//sadItemchứa hai dấu/liên tiếp. - Thao tác danh sách tại
lonelyItem/không trả về tham chiếu nào vì đối tượnglonelyItem/kết thúc bằng/.
Liệt kê tất cả các tệp
Bạn có thể sử dụng listAll(completion:) để tìm nạp tất cả kết quả cho một thư mục.
Phương thức này phù hợp nhất với các thư mục nhỏ vì tất cả kết quả đều được lưu vào bộ nhớ.
Thao tác này cũng có thể không trả về ảnh chụp nhanh nhất quán nếu các đối tượng được thêm hoặc xoá trong quá trình này.
Đối với danh sách lớn, hãy sử dụng phương thức list(withMaxResults:completion:) được phân trang vì listAll(completion:) lưu tất cả kết quả vào bộ nhớ.
Ví dụ sau đây minh hoạ 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. } }];
Phân trang kết quả danh sách
API list(withMaxResults:completion:) đặt giới hạn về số lượng kết quả mà API này trả về. list(withMaxResults:completion) cung cấp một lượt xem trang nhất quán và hiển thị một pageToken cho phép kiểm soát thời điểm tìm nạp thêm kết quả.
pageToken mã hoá đường dẫn và phiên bản của mục cuối cùng được trả về trong kết quả trước đó. Trong một yêu cầu tiếp theo sử dụng pageToken, các mục xuất hiện sau pageToken sẽ được hiển thị.
Ví dụ sau đây minh hoạ cách phân trang kết quả:
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]; } }
Xử lý lỗi
Các phương thức trong API danh sách sẽ không thành công nếu bạn chưa nâng cấp Quy tắc bảo mật lên phiên bản 2. Hãy nâng cấp Quy tắc bảo mật nếu bạn thấy lỗi này:
Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.
Các lỗi có thể xảy ra khác có thể cho biết người dùng không có quyền phù hợp. Bạn có thể tìm thêm thông tin về lỗi trong phần Xử lý lỗi.