Cloud Storage for Firebase מאפשרת להציג את תוכן הקטגוריה Cloud Storage. ערכות ה-SDK מחזירות גם את הפריטים וגם את הקידומות של האובייקטים בהפניה הנוכחית של Cloud Storage.
בפרויקטים שמשתמשים ב-list API נדרשת גרסה 2 של Cloud Storage for Firebase Rules. אם יש לכם פרויקט Firebase קיים, בצעו את השלבים המפורטים במדריך לכללי האבטחה.
list()
משתמש ב-Google Cloud Storage List API.
ב-Cloud Storage for Firebase, אנחנו משתמשים ב-/
כמפריד, שמאפשר לנו לדמות את הסמנטיקה של מערכת הקבצים. כדי לאפשר סריקה יעילה של קטגוריות Cloud Storage גדולות והיררכיות, ממשק ה-List API מחזיר תחיליות ופריטים בנפרד. לדוגמה, אם מעלים את הקובץ /images/uid/file1
,
- הפונקציה
root.child('images').listAll()
תחזיר את/images/uid
כקידומת. root.child('images/uid').listAll()
תחזיר את הקובץ כפריט.
ערכת ה-SDK של Cloud Storage for Firebase לא מחזירה נתיבים של אובייקטים שמכילים שני תווים /
ברצף או שמסתיימים ב-/.
. לדוגמה, נניח שיש לכם קטגוריה עם האובייקטים הבאים:
correctPrefix/happyItem
wrongPrefix//sadItem
lonelyItem/
פעולות הרשימה על פריטים בקטגוריה הזו יניבו את התוצאות הבאות:
- פעולת הרשימה ברמה הבסיסית מחזירה את ההפניות אל
correctPrefix
,wrongPrefix
ו-lonelyItem
בתורprefixes
. - פעולת הרשימה ב-
correctPrefix/
מחזירה את ההפניות ל-correctPrefix/happyItem
בתורitems
. - פעולת הרשימה ב-
wrongPrefix/
לא מחזירה הפניות כיwrongPrefix//sadItem
מכיל שתי פעולות/
ברצף. - פעולת הרשימה ב-
lonelyItem/
לא מחזירה הפניות כי האובייקטlonelyItem/
מסתיים ב-/
.
הצגת רשימה של כל הקבצים
אפשר להשתמש ב-listAll(completion:)
כדי לאחזר את כל התוצאות של ספרייה.
מומלץ להשתמש באפשרות הזו בספריות קטנות, כי כל התוצאות נשמרות במטמון בזיכרון.
בנוסף, יכול להיות שהפעולה לא תחזיר קובץ snapshot עקבי אם אובייקטים נוספו או הוסרו במהלך התהליך.
אם יוצרים רשימה גדולה, אפשר להשתמש ב-method 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]; } }
טיפול בשגיאות
ה-methods ב-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.
שגיאות אפשריות אחרות עשויות להצביע על כך שלמשתמש אין את ההרשאות המתאימות. מידע נוסף על שגיאות זמין במאמר טיפול בשגיאות.