Liệt kê tệp bằng Cloud Storage trên web

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

Các dự án sử dụng List API yêu cầu Cloud Storage for Firebase Quy tắc Phiên bản 2. Nếu bạn đang có một dự án Firebase, hãy làm theo các bước trong Hướng dẫn về quy tắc bảo mật.

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

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

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

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

Thao tác danh sách trên các mục trong bộ chứa này sẽ cho ra kết quả như sau:

  • Thao tác danh sách ở gốc trả về các tệp tham chiếu đến correctPrefix, wrongPrefixlonelyItem dưới dạng prefixes.
  • Thao tác danh sách tại correctPrefix/ sẽ trả về tham chiếu đến 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 / 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ả tệp

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

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

Ví dụ sau minh hoạ 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!
  });

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

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

pageToken mã hoá đườ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 một yêu cầu tiếp theo sử dụng pageToken, các mục xuất hiện sau pageToken sẽ xuất hiện.

Ví dụ sau đây minh hoạ cách phân trang kết quả bằng 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)
  }
}

Xử lý lỗi

list()listAll() trả về một Promise 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. 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ể xem thêm thông tin về lỗi trong phần Xử lý lỗi.