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

Cloud Storage for Firebase מאפשר לך לרשום את התוכן של דלי Cloud Storage שלך. ה-SDKs מחזירים גם את הפריטים וגם את הקידומות של אובייקטים תחת ההפניה הנוכחית של Cloud Storage.

פרויקטים המשתמשים ב-API של רשימה דורשים Cloud Storage for Firebase Rules גרסה 2. אם יש לך פרויקט 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() יחזיר את הקובץ כפריט.

ה-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:) כדי להביא את כל התוצאות עבור ספרייה. זה משמש בצורה הטובה ביותר עבור ספריות קטנות מכיוון שכל התוצאות מאוחסנות בזיכרון. ייתכן שהפעולה גם לא תחזיר תמונת מצב עקבית אם אובייקטים יתווספו או יוסרו במהלך התהליך.

לרשימה גדולה, השתמש בשיטת 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.

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