فهرست کردن فایل‌ها با Cloud Storage در وب

Cloud Storage for Firebase به شما امکان می‌دهد محتویات Cloud Storage bucket خود را فهرست کنید. کیت‌های توسعه نرم‌افزار هم موارد و هم پیشوندهای اشیاء را تحت مرجع Cloud Storage فعلی برمی‌گردانند.

پروژه‌هایی که از List 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 مسیرهای شیء را که حاوی دو / متوالی باشند یا به /. ختم شوند برنمی‌گرداند. برای مثال، یک فضای ذخیره‌سازی را درنظر بگیرید که دارای اشیاء زیر است:

  • 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() API برای تعداد نتایجی که برمی‌گرداند محدودیت تعیین می‌کند. 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.

خطاهای احتمالی دیگر ممکن است نشان دهد که کاربر اجازه لازم را ندارد. اطلاعات بیشتر درباره خطاها را می‌توانید در رسیدگی به خطاها پیدا کنید.