Liệt kê file bằng Cloud Storage trên Web

Cloud Storage cho Firebase cho phép bạn liệt kê nội dung của nhóm Cloud Storage. SDK trả về cả các mục và tiền tố của các đối tượng trong tham chiếu Lưu trữ đám mây hiện tại.

Các dự án sử dụng API danh sách yêu cầu Cloud Storage dành cho Quy tắc Firebase phiên bản 2. Nếu bạn hiện có dự án Firebase, hãy làm theo các bước trong Hướng dẫn quy tắc bảo mật .

list() sử dụng API danh sách lưu trữ đám mây của Google . Trong Cloud Storage cho Firebase, chúng tôi sử dụng / làm dấu phân cách, cho phép chúng tôi mô phỏng ngữ nghĩa hệ thống tệp. Để cho phép truyền tải hiệu quả các nhóm Lưu trữ đám mây lớn, phân cấp, API Danh sách sẽ trả về các tiền tố và mục riêng biệt. Ví dụ: nếu bạn tải lên một tệp /images/uid/file1 ,

  • root.child('images').listAll() sẽ trả về /images/uid làm tiền tố.
  • root.child('images/uid').listAll() sẽ trả về tệp dưới dạng một mục.

SDK Cloud Storage cho Firebase không trả về đường dẫn đối tượng chứa hai / s liên tiếp hoặc kết thúc bằng /. . Ví dụ: hãy xem xét một nhóm có các đối tượng sau:

  • correctPrefix/happyItem
  • wrongPrefix//sadItem
  • lonelyItem/

Các thao tác danh sách trên các mục trong nhóm này sẽ cho kết quả như sau:

  • Thao tác danh sách tại thư mục gốc trả về các tham chiếu tới correctPrefix , wrongPrefixlonelyItem dưới dạng prefixes .
  • Thao tác danh sách tại correctPrefix/ trả về các tham chiếu tới correctPrefix/happyItem dưới dạng items .
  • Thao tác danh sách tại wrongPrefix/ không trả về bất kỳ tham chiếu nào vì wrongPrefix//sadItem chứa hai / s liên tiếp.
  • Thao tác danh sách tại lonelyItem/ không trả về bất kỳ tham chiếu nào vì đối tượng lonelyItem/ kết thúc bằng / .

Liệt kê tất cả các tập tin

Bạn có thể sử dụng listAll để tìm nạp tất cả kết quả cho một thư mục. Điều này được sử dụng tốt nhất cho các thư mục nhỏ vì tất cả kết quả đều được lưu vào bộ nhớ. Thao tác cũng có thể không trả về ảnh chụp nhanh nhất quán nếu các đối tượng được thêm hoặc xóa trong quá trình này.

Đối với một danh sách lớn, hãy sử dụng phương thức list() được phân trang vì listAll() đệm tất cả các kết quả vào bộ nhớ.

Ví dụ sau đây minh họa listAll .

Web modular API

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 namespaced API

// 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!
  });

Phân trang kết quả danh sách

API list() đặt giới hạn về số lượng kết quả mà nó trả về. list() cung cấp số lần xem trang nhất quán và hiển thị pageToken cho phép kiểm soát thời điểm tìm nạp kết quả bổ sung.

pageToken mã hóa đường dẫn và phiên bản của mục cuối cùng được trả về trong kết quả trước đó. Trong yêu cầu tiếp theo sử dụng pageToken, các mục xuất hiện sau pageToken sẽ được hiển thị.

Ví dụ sau đây minh họa việc phân trang kết quả bằng cách sử dụng async/await .

Web modular API

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 namespaced API

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)
  }
}

Xử lý lỗi

list()listAll() trả về Lời hứa bị từ chối nếu bạn chưa nâng cấp Quy tắc bảo mật lên phiên bản 2. Hãy nâng cấp Quy tắc bảo mật nếu bạn thấy lỗi này:

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

Các lỗi khác có thể xảy ra có thể cho thấy người dùng không có quyền phù hợp. Bạn có thể tìm thêm thông tin về lỗi trong Xử lý lỗi .