在 Flutter 中使用 Cloud Storage 列出檔案

Cloud Storage for Firebase 可讓您列出 Cloud Storage 值區SDK 會同時傳回項目和 物件。

使用 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 的參照。 wrongPrefixlonelyItemprefixes 格式顯示。
  • correctPrefix/ 的清單作業會傳回對 以 items 格式 correctPrefix/happyItem
  • wrongPrefix/ 中的清單作業不會傳回任何參照 因為 wrongPrefix//sadItem 包含兩個連續的 /
  • lonelyItem/ 中的清單作業不會傳回任何參照 因為物件 lonelyItem/ 的結尾是 /

列出所有檔案

您可以使用 listAll 擷取目錄的所有結果。 這最適合用於小型目錄,因為所有結果都會在記憶體中緩衝處理。 如果新增物件或 未達成協議

如果是大型清單,請使用分頁化的 list() 方法,做為 listAll() 緩衝區, 會產生記憶體

以下範例示範 listAll

final storageRef = FirebaseStorage.instance.ref().child("files/uid");
final listResult = await storageRef.listAll();
for (var prefix in listResult.prefixes) {
  // The prefixes under storageRef.
  // You can call listAll() recursively on them.
}
for (var item in listResult.items) {
  // The items under storageRef.
}

分頁清單結果

list() API 會限制傳回的結果數量。list() 可提供一致的網頁瀏覽,並公開可讓您掌控 何時該擷取額外結果

pageToken 會對 上一個結果。在後續使用 pageToken 的後續要求中, 顯示有關

以下範例說明如何將結果分頁:

Stream<ListResult> listAllPaginated(Reference storageRef) async* {
  String? pageToken;
  do {
    final listResult = await storageRef.list(ListOptions(
      maxResults: 100,
      pageToken: pageToken,
    ));
    yield listResult;
    pageToken = listResult.nextPageToken;
  } while (pageToken != null);
}

處理錯誤

如未升級,list()listAll()會失敗 升級至第 2 版的安全性規則這時請升級安全性規則 (如果有的話) 錯誤:

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

其他可能的錯誤則代表使用者沒有適當權限。 如要進一步瞭解錯誤,請參閱處理錯誤一文 頁面。