Flutter पर Cloud Storage की मदद से फ़ाइलों की सूची बनाना

Cloud Storage for Firebase की मदद से, Cloud Storage बकेट में मौजूद कॉन्टेंट की सूची बनाई जा सकती है. SDK, मौजूदा Cloud Storage रेफ़रंस के तहत ऑब्जेक्ट के आइटम और प्रीफ़िक्स, दोनों दिखाते हैं.

List API का इस्तेमाल करने वाले प्रोजेक्ट के लिए, Cloud Storage for Firebase के नियमों का वर्शन 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 का इस्तेमाल किया जा सकता है. इसका इस्तेमाल छोटी डायरेक्ट्री के लिए सबसे सही होता है, क्योंकि सभी नतीजे मेमोरी में बफ़र किए जाते हैं. अगर प्रोसेस के दौरान ऑब्जेक्ट जोड़े या हटाए जाते हैं, तो हो सकता है कि ऑपरेशन से एक जैसा स्नैपशॉट न मिले.

बड़ी सूची के लिए, पेज के हिसाब से बांटे गए list() तरीके का इस्तेमाल करें, क्योंकि listAll() सभी नतीजों को मेमोरी में बफ़र करता है.

यहां दिए गए उदाहरण में, listAll के बारे में बताया गया है.

final storageRef = FirebaseStorage.instance.ref().child("files/uid");
final listResult = await storageRef.listAll();
for (var prefix in listResult.prefixes) {
  // The prefixes under storageRef.
  // You can call listAll() recursively on them.
}
for (var item in listResult.items) {
  // The items under storageRef.
}

सूची के नतीजों को पेज के हिसाब से बांटना

list() एपीआई, खोज के नतीजों की संख्या को सीमित करता है. list() लगातार पेज व्यू उपलब्ध कराता है और एक पेजटोकन दिखाता है. इससे यह कंट्रोल किया जा सकता है कि अतिरिक्त नतीजे कब फ़ेच किए जाएं.

pageToken, पिछले नतीजे में दिखाए गए आखिरी आइटम के पाथ और वर्शन को एन्कोड करता है. pageToken का इस्तेमाल करके किए गए अगले अनुरोध में, pageToken के बाद आने वाले आइटम दिखाए जाते हैं.

यहां दिए गए उदाहरण में, नतीजे को पेज में बांटने का तरीका दिखाया गया है:

Stream<ListResult> listAllPaginated(Reference storageRef) async* {
  String? pageToken;
  do {
    final listResult = await storageRef.list(ListOptions(
      maxResults: 100,
      pageToken: pageToken,
    ));
    yield listResult;
    pageToken = listResult.nextPageToken;
  } while (pageToken != null);
}

गड़बड़ियां ठीक करना

अगर आपने सुरक्षा के नियमों को वर्शन 2 पर अपग्रेड नहीं किया है, तो list() और listAll() काम नहीं करेंगे. अगर आपको यह गड़बड़ी दिखती है, तो सुरक्षा के नियमों को अपग्रेड करें:

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

अन्य गड़बड़ियों से पता चल सकता है कि उपयोगकर्ता के पास सही अनुमति नहीं है. गड़बड़ियों के बारे में ज़्यादा जानकारी, गड़बड़ियों को ठीक करना पेज पर मिल सकती है.