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 के बारे में बताया गया है.

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 का इस्तेमाल करके किए गए अगले अनुरोध में, 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)
  }
}

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

अगर आपने सुरक्षा नियमों को दूसरे वर्शन पर अपग्रेड नहीं किया है, तो 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.

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