Membuat daftar file dengan Cloud Storage di Android

Cloud Storage for Firebase memungkinkan Anda untuk menampilkan daftar isi bucket Cloud Storage. SDK menampilkan item dan awalan objek berdasarkan referensi Cloud Storage saat ini.

Project yang menggunakan List API memerlukan Aturan Cloud Storage for Firebase versi 2. Jika Anda sudah memiliki project Firebase, ikuti langkah-langkah dalam Panduan Aturan Keamanan.

list() menggunakan Google Cloud Storage List API. Di Cloud Storage for Firebase, kita menggunakan / sebagai pemisah, sehingga kita dapat mengemulasikan semantik sistem file. Agar traversal bucket Cloud 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.

Cloud Storage for Firebase SDK tidak menampilkan jalur objek yang berisi dua / berturut-turut atau diakhiri dengan tanda /. Misalnya, pertimbangkan bucket yang 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 ke correctPrefix, wrongPrefix, dan lonelyItem sebagai prefixes.
  • Operasi daftar di correctPrefix/ akan menampilkan referensi ke correctPrefix/happyItem sebagai items.
  • Operasi daftar di wrongPrefix/ tidak akan menampilkan referensi apa pun karena wrongPrefix//sadItem berisi dua / berturut-turut.
  • Operasi daftar di lonelyItem/ tidak akan menampilkan referensi apa pun karena objek lonelyItem/ diakhiri dengan tanda /.

Membuat daftar semua file

Anda dapat menggunakan listAll 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() yang diberi nomor halaman, karena listAll() akan mem-buffer semua hasil dalam memori.

Contoh berikut menunjukkan listAll.

Kotlin+KTX

val storage = Firebase.storage
val listRef = storage.reference.child("files/uid")

// You'll need to import com.google.firebase.storage.component1 and
// com.google.firebase.storage.component2
listRef.listAll()
    .addOnSuccessListener { (items, prefixes) ->
        for (prefix in prefixes) {
            // All the prefixes under listRef.
            // You may call listAll() recursively on them.
        }

        for (item in items) {
            // All the items under listRef.
        }
    }
    .addOnFailureListener {
        // Uh-oh, an error occurred!
    }

Java

StorageReference listRef = storage.getReference().child("files/uid");

listRef.listAll()
        .addOnSuccessListener(new OnSuccessListener<ListResult>() {
            @Override
            public void onSuccess(ListResult listResult) {
                for (StorageReference prefix : listResult.getPrefixes()) {
                    // All the prefixes under listRef.
                    // You may call listAll() recursively on them.
                }

                for (StorageReference item : listResult.getItems()) {
                    // All the items under listRef.
                }
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Uh-oh, an error occurred!
            }
        });

Memberi nomor halaman pada hasil daftar

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

PageToken mengenkode jalur 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 halaman pada hasil:

Kotlin+KTX

fun listAllPaginated(pageToken: String?) {
    val storage = Firebase.storage
    val listRef = storage.reference.child("files/uid")

    // Fetch the next page of results, using the pageToken if we have one.
    val listPageTask = if (pageToken != null) {
        listRef.list(100, pageToken)
    } else {
        listRef.list(100)
    }

    // You'll need to import com.google.firebase.storage.component1 and
    // com.google.firebase.storage.component2
    listPageTask
        .addOnSuccessListener { (items, prefixes, pageToken) ->
            // Process page of results
            processResults(items, prefixes)

            // Recurse onto next page
            pageToken?.let {
                listAllPaginated(it)
            }
        }.addOnFailureListener {
            // Uh-oh, an error occurred.
        }
}

Java

public void listAllPaginated(@Nullable String pageToken) {
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference listRef = storage.getReference().child("files/uid");

    // Fetch the next page of results, using the pageToken if we have one.
    Task<ListResult> listPageTask = pageToken != null
            ? listRef.list(100, pageToken)
            : listRef.list(100);

    listPageTask
            .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                @Override
                public void onSuccess(ListResult listResult) {
                    List<StorageReference> prefixes = listResult.getPrefixes();
                    List<StorageReference> items = listResult.getItems();

                    // Process page of results
                    // ...

                    // Recurse onto next page
                    if (listResult.getPageToken() != null) {
                        listAllPaginated(listResult.getPageToken());
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // Uh-oh, an error occurred.
                }
            });
}

Menangani error

list() dan listAll() 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.

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