Apple প্ল্যাটফর্মে Cloud Storage-এর মাধ্যমে ফাইল তালিকাভুক্ত করা

Cloud Storage for Firebase আপনাকে নিজের Cloud Storage বাকেটের কন্টেন্ট তালিকাভুক্ত করার অনুমতি দেয়। SDK, বর্তমান Cloud Storage রেফারেন্সের অধীনে থাকা অবজেক্টের আইটেম ও প্রিফিক্স দুটিই রিটার্ন করে।

যেসব প্রোজেক্ট তালিকা API ব্যবহার করে সেগুলির জন্য Cloud Storage for Firebase নিয়ম ভার্সন ২ প্রয়োজন। আপনার আগে থেকে কোনও 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:) দেখানো হয়েছে।

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:) API-এর মাধ্যমে প্রাপ্ত ফলাফলের সংখ্যার উপর সীমা নির্ধারণ করা হয়। list(withMaxResults:completion) একটি ধারাবাহিক পেজভিউ প্রদান করে এবং একটি pageToken প্রকাশ করে যা অতিরিক্ত ফলাফল কখন ফেচ করতে হবে তা নিয়ন্ত্রণ করতে দেয়।

page টোকেন আগের ফলাফলে ফিরে আসা শেষ আইটেমের পাথ ও ভার্সন এনকোড করে। 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];
  }
}

সমস্যা ম্যানেজ করা

আপনি নিজের নিরাপত্তা নিয়মকে ভার্সন ২-এ আপগ্রেড না করে থাকলে, তালিকা API-এর পদ্ধতি কাজ করবে না। আপনি এই সমস্যাটি দেখতে পেলে, আপনার নিরাপত্তা সংক্রান্ত নিয়ম আপগ্রেড করুন:

Listing objects in a bucket is disallowed for rules_version = "1".
Please update storage security rules to rules_version = "2" to use list.

অন্যান্য সম্ভাব্য সমস্যা থেকে বোঝা যেতে পারে যে ব্যবহারকারীর কাছে সঠিক অনুমতি নেই। সমস্যা সম্পর্কে আরও তথ্য সমস্যার সমাধান করুন লিঙ্কে পাওয়া যাবে।