הצגה של רשימת קבצים באמצעות Cloud Storage בפלטפורמות של Apple

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.

שגיאות אפשריות אחרות עשויות להצביע על כך שלמשתמש אין את ההרשאות המתאימות. מידע נוסף על שגיאות זמין במאמר טיפול בשגיאות.