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

Cloud Storage for Firebase की मदद से, Cloud Storage बकेट में मौजूद कॉन्टेंट की सूची देखी जा सकती है. एसडीके, मौजूदा 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() API, नतीजों की संख्या पर सीमा लगाता है. list() , एक जैसा पेज व्यू उपलब्ध कराता है. साथ ही, एक pageToken दिखाता है. इससे यह कंट्रोल किया जा सकता है कि अतिरिक्त नतीजे कब फ़ेच किए जाएं.

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.

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