قم بإدراج الملفات باستخدام Cloud Storage على منصات Apple

يتيح لك Cloud Storage for Firebase إدراج محتويات مجموعة Cloud Storage الخاصة بك. تقوم مجموعات SDK بإرجاع كل من العناصر وبادئات الكائنات ضمن مرجع Cloud Storage الحالي.

تتطلب المشروعات التي تستخدم قائمة واجهة برمجة التطبيقات (API) الإصدار 2 من Cloud Storage for Firebase Rules. إذا كان لديك مشروع Firebase حالي، فاتبع الخطوات الواردة في دليل قواعد الأمان .

يستخدم list() واجهة برمجة تطبيقات Google Cloud Storage List . في Cloud Storage for Firebase، نستخدم / كمحدد، مما يسمح لنا بمحاكاة دلالات نظام الملفات. للسماح بالاجتياز الفعال لحاويات التخزين السحابي الكبيرة والهرمية، تقوم واجهة برمجة تطبيقات القائمة بإرجاع البادئات والعناصر بشكل منفصل. على سبيل المثال، إذا قمت بتحميل ملف واحد /images/uid/file1 ،

  • root.child('images').listAll() سيعيد /images/uid كبادئة.
  • root.child('images/uid').listAll() سيعيد الملف كعنصر.

لا يُرجع Cloud Storage for Firebase SDK مسارات الكائنات التي تحتوي على / s متتاليتين أو تنتهي بـ /. . على سبيل المثال، فكر في دلو يحتوي على الكائنات التالية:

  • correctPrefix/happyItem
  • wrongPrefix//sadItem
  • lonelyItem/

ستعطي عمليات القائمة على العناصر الموجودة في هذه المجموعة النتائج التالية:

  • تقوم عملية القائمة في الجذر بإرجاع المراجع إلى correctPrefix و wrongPrefix و lonelyItem prefixes .
  • تقوم عملية القائمة في correctPrefix/ بإرجاع المراجع إلى correctPrefix/happyItem items .
  • عملية القائمة في wrongPrefix/ لا تُرجع أي مراجع لأن wrongPrefix//sadItem يحتوي على اثنين / s متتاليتين.
  • لا تُرجع عملية القائمة في 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 {
  // ...
}

ج موضوعية

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، يتم عرض العناصر التي تأتي بعد 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)
  }
}

ج موضوعية

- (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.

قد تشير الأخطاء المحتملة الأخرى إلى أن المستخدم ليس لديه الأذونات الصحيحة. يمكن العثور على مزيد من المعلومات حول الأخطاء في التعامل مع الأخطاء .