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

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

List API का इस्तेमाल करने वाले प्रोजेक्ट के लिए, Cloud Storage for Firebase Rules Version 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 को दिखाया गया है.

Web

import { getStorage, ref, listAll } from "firebase/storage";

const storage = getStorage();

// Create a reference under which you want to list
const listRef = ref(storage, 'files/uid');

// Find all the prefixes and items.
listAll(listRef)
  .then((res) => {
    res.prefixes.forEach((folderRef) => {
      // All the prefixes under listRef.
      // You may call listAll() recursively on them.
    });
    res.items.forEach((itemRef) => {
      // All the items under listRef.
    });
  }).catch((error) => {
    // Uh-oh, an error occurred!
  });

Web

// Create a reference under which you want to list
var listRef = storageRef.child('files/uid');

// Find all the prefixes and items.
listRef.listAll()
  .then((res) => {
    res.prefixes.forEach((folderRef) => {
      // All the prefixes under listRef.
      // You may call listAll() recursively on them.
    });
    res.items.forEach((itemRef) => {
      // All the items under listRef.
    });
  }).catch((error) => {
    // Uh-oh, an error occurred!
  });

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

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

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

यहां दिए गए उदाहरण में, async/await का इस्तेमाल करके, नतीजे को पेज में बांटने का तरीका दिखाया गया है.

Web

import { getStorage, ref, list } from "firebase/storage";

async function pageTokenExample(){
  // Create a reference under which you want to list
  const storage = getStorage();
  const listRef = ref(storage, 'files/uid');

  // Fetch the first page of 100.
  const firstPage = await list(listRef, { maxResults: 100 });

  // Use the result.
  // processItems(firstPage.items)
  // processPrefixes(firstPage.prefixes)

  // Fetch the second page if there are more elements.
  if (firstPage.nextPageToken) {
    const secondPage = await list(listRef, {
      maxResults: 100,
      pageToken: firstPage.nextPageToken,
    });
    // processItems(secondPage.items)
    // processPrefixes(secondPage.prefixes)
  }
}

Web

async function pageTokenExample(){
  // Create a reference under which you want to list
  var listRef = storageRef.child('files/uid');

  // Fetch the first page of 100.
  var firstPage = await listRef.list({ maxResults: 100});

  // Use the result.
  // processItems(firstPage.items)
  // processPrefixes(firstPage.prefixes)

  // Fetch the second page if there are more elements.
  if (firstPage.nextPageToken) {
    var secondPage = await listRef.list({
      maxResults: 100,
      pageToken: firstPage.nextPageToken,
    });
    // processItems(secondPage.items)
    // processPrefixes(secondPage.prefixes)
  }
}

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

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

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

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