Membuat Daftar File di iOS

Dengan Cloud Storage, Anda dapat membuat daftar isi Bucket Storage. SDK menampilkan item dan awalan objek berdasarkan referensi Storage saat ini.

Project yang menggunakan list API membutuhkan Aturan Firebase Storage Versi 2. Jika Anda sudah memiliki Project Firebase, ikuti langkah-langkah dalam Panduan Aturan Keamanan.

List API menggunakan List API Google Cloud Storage. Dalam Firebase Storage, kami menggunakan tanda / sebagai pemisah agar dapat mengemulasikan semantik sistem file. Agar traversal Bucket Storage yang besar dan hierarkis menjadi efisien, List API menampilkan awalan dan item secara terpisah. Misalnya, jika Anda mengupload satu file /images/uid/file1,

  • root.child('images').listAll() akan menampilkan /images/uid sebagai awalan.
  • root.child('images/uid').listAll() akan menampilkan file sebagai item.

Firebase Storage SDK tidak akan menampilkan jalur objek yang berisi dua tanda / berturut-turut atau diakhiri dengan tanda /.. Misalnya, jika bucket memiliki objek berikut:

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

Operasi daftar pada item dalam bucket ini akan memberikan hasil berikut:

  • Operasi daftar di root akan menampilkan referensi untuk correctPrefix, wrongPrefix dan lonelyItem sebagai prefixes.
  • Operasi daftar di correctPrefix/ akan menampilkan referensi untuk correctPrefix/happyItem sebagai items.
  • Operasi daftar di wrongPrefix/ tidak akan menampilkan referensi apa pun karena wrongPrefix//sadItem berisi dua tanda / berturut-turut.
  • Operasi daftar di lonelyItem/ tidak akan menampilkan referensi apa pun karena lonelyItem/ objek diakhiri dengan tanda /.

Membuat daftar semua file

Anda dapat menggunakan listAll(completion:) untuk mengambil semua hasil untuk direktori. Cara ini paling baik digunakan untuk direktori kecil karena semua hasil di-buffer di memori. Operasi tersebut juga tidak dapat menampilkan snapshot yang konsisten jika objek ditambahkan atau dihapus selama proses ini.

Untuk daftar besar, gunakan metode list(withMaxResults:completion:) yang diberi nomor halaman, karena listAll(completion:) akan mem-buffer semua hasil dalam memori.

Contoh berikut menunjukkan listAll(completion:).

Swift

let storageReference = storage.reference().child("files/uid")
storageReference.listAll { (result, error) in
  if let error = error {
    // ...
  }
  for prefix in result.prefixes {
    // The prefixes under storageReference.
    // You may call listAll(completion:) recursively on them.
  }
  for item in result.items {
    // The items under storageReference.
  }
}

Objective-C

FIRStorageReference *storageReference = [storage reference];
[storageReference listAllWithCompletion:^(FIRStorageListResult *result, NSError *error) {
  if (error != nil) {
    // ...
  }

  for (FIRStorageReference *prefix in result.prefixes) {
    // All the prefixes under storageReference.
    // You may call listAllWithCompletion: recursively on them.
  }
  for (FIRStorageReference *item in result.items) {
    // All items under storageReference.
  }
}];

Memberi nomor pada hasil daftar

list(withMaxResults:completion:) API memberikan batasan pada jumlah hasil yang ditampilkannya. list(withMaxResults:completion) memberikan informasi tentang kunjungan halaman yang konsisten, serta menampilkan pageToken yang dapat digunakan untuk mengontrol waktu pengambilan hasil tambahan.

PageToken mengenkode lokasi dan versi item terakhir yang ditampilkan dalam hasil sebelumnya. Dalam permintaan berikutnya yang menggunakan pageToken, item yang muncul setelah pageToken akan ditampilkan.

Contoh berikut menunjukkan pemberian nomor pada hasil:

Swift

func listAllPaginated(pageToken: String? = nil) {
  let storage = Storage.storage()
  let storageReference = storage.reference().child("files/uid")

  let pageHandler: (StorageListResult, Error?) -> Void = { (result, error) in
    if let error = error {
      // ...
    }
    let prefixes = result.prefixes
    let items = result.items

    // ...

    // Process next page
    if let token = result.pageToken {
      self.listAllPaginated(pageToken: token)
    }
  }

  if let pageToken = pageToken {
    storageReference.list(withMaxResults: 100, pageToken: pageToken, completion: pageHandler)
  } else {
    storageReference.list(withMaxResults: 100, completion: pageHandler)
  }
}

Objective-C

- (void)paginateFilesAtReference:(FIRStorageReference *)reference
                       pageToken:(nullable NSString *)pageToken {
  void (^pageHandler)(FIRStorageListResult *_Nonnull, NSError *_Nullable) =
      ^(FIRStorageListResult *result, NSError *error) {
        if (error != nil) {
          // ...
        }
        NSArray *prefixes = result.prefixes;
        NSArray *items = result.items;

        // ...

        // Process next page
        if (result.pageToken != nil) {
          [self paginateFilesAtReference:reference pageToken:result.pageToken];
        }
  };

  if (pageToken != nil) {
    [reference listWithMaxResults:100 pageToken:pageToken completion:pageHandler];
  } else {
    [reference listWithMaxResults:100 completion:pageHandler];
  }
}

Menangani error

Metode di List API akan gagal jika Anda belum mengupgrade Aturan Keamanan ke versi 2. Upgrade Aturan Keamanan jika Anda melihat pesan error ini:

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

Kemungkinan error lainnya dapat menunjukkan bahwa pengguna tidak memiliki izin yang tepat. Informasi lebih lanjut mengenai error dapat ditemukan di bagian Menangani Error.