Cloud Storage cho Firebase cho phép bạn liệt kê các nội dung của Bộ chứa Cloud Storage. SDK trả về cả mặt hàng và tiền tố đối tượng trong tệp tham chiếu hiện tại của Cloud Storage.
Các dự án sử dụng API danh sách cần có Cloud Storage cho Firebase Quy tắc phiên bản 2. Nếu bạn đang có một dự án Firebase, 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
API Danh sách Google Cloud Storage.
Trong Cloud Storage cho Firebase, chúng ta dùng /
làm dấu phân cách, cho phép chúng ta
mô phỏng ngữ nghĩa của hệ thống tệp. Để cho phép truyền tải hiệu quả các tệp lớn,
bộ chứa Cloud Storage phân cấp, List API trả về các 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/uid
dướ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 cho Firebase không trả về các đường dẫn đối tượng chứa hai
/
liên tiếp hoặc kết thúc bằng /.
. Ví dụ: hãy xem xét một bộ chứa có
các đối tượng sau:
correctPrefix/happyItem
wrongPrefix//sadItem
lonelyItem/
Thao tác danh sách trên các mục trong bộ chứa này sẽ cho ra kết quả như sau:
- Thao tác danh sách ở gốc sẽ trả về tham chiếu đến
correctPrefix
,wrongPrefix
vàlonelyItem
trong vai tròprefixes
. - Thao tác danh sách tại
correctPrefix/
sẽ trả về tham chiếu đếncorrectPrefix/happyItem
theo phong cáchitems
. - Thao tác danh sách tại
wrongPrefix/
không trả về bất kỳ tệp tham chiếu nào vìwrongPrefix//sadItem
chứa hai/
liên tiếp. - Thao tác danh sách tại
lonelyItem/
không trả về bất kỳ tệp 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.
Bạn nên sử dụng cách này tốt nhất cho các thư mục nhỏ vì tất cả kết quả đều được lưu vào vùng đệm trong bộ nhớ.
Thao tác này cũng có thể không trả về một ảnh chụp nhanh nhất quán nếu các đối tượng được thêm vào hoặc
bị loại bỏ trong quá trình này.
Đối với một danh sách lớn, hãy sử dụng phương thức list(withMaxResults:completion:)
được phân trang như
listAll(completion:)
lưu vào bộ đệm tất cả kết quả trong bộ nhớ.
Ví dụ sau 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à nó trả về. list(withMaxResults:completion)
mang đến sự nhất quán
xem trang và hiển thị một pageToken cho phép kiểm soát thời điểm tìm nạp
kết quả bổ sung.
Mã trang 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 bằng cách dùng pageToken, các mục xuất hiện sau khi pageToken được hiển thị.
Ví dụ sau đây minh hoạ việc 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. 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 khác có thể cho thấy người dùng không có các quyền phù hợp. Bạn có thể xem thêm thông tin về các lỗi trong Xử lý lỗi.