إدراج الملفات في 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:) لعرض جميع النتائج لدليل معيّن. يُفضّل استخدام هذا الخيار مع الدلائل الصغيرة، لأنّه يتم تخزين جميع النتائج مؤقتًا في الذاكرة. قد لا تُعرِض العملية أيضًا لقطة اتّساقية إذا تمت إضافة عناصر أو إزالتها أثناء العملية.

بالنسبة إلى القائمة الكبيرة، استخدِم طريقة 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.
  }
}];

تقسيم نتائج القائمة إلى صفحات

تفرض واجهة برمجة التطبيقات list(withMaxResults:completion:) حدًا لعدد النتائج التي تعرِضها. يوفّر list(withMaxResults:completion) عرضًا متسقًا للصفحة ويعرِض معرّف صفحة يتيح التحكّم في وقت جلب النتائج الإضافية.

يُشفِّر المعرّف 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];
  }
}

معالجة الأخطاء

لن تعمل الطرق في واجهة برمجة التطبيقات List 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.

قد تشير الأخطاء الأخرى المحتمَلة إلى أنّ المستخدم لا يملك الأذونات المناسبة. يمكنك الاطّلاع على مزيد من المعلومات عن الأخطاء في مقالة معالجة الأخطاء.