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

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

Các dự án sử dụng List API cần có Cloud Storage cho 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 cho Firebase, chúng ta dùng / làm dấu phân cách, cho phép chúng ta mô phỏng ngữ nghĩa của hệ thống tệp. Để cho phép truyền tải hiệu quả các tệp lớn, bộ chứa Cloud Storage phân cấp, List API trả về tiền tố và các 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 cho Firebase không trả về các đường dẫn đối tượng chứa hai / 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 sẽ trả về tham chiếu đến correctPrefix, wrongPrefixlonelyItem trong vai tr�� prefixes.
  • Thao tác danh sách tại correctPrefix/ sẽ trả về tham chiếu đến correctPrefix/happyItem theo phong cách items.
  • Thao tác danh sách tại wrongPrefix/ không trả về bất kỳ tệp 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ỳ tệp 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

Bạn có thể sử dụng listAll để tìm nạp tất cả kết quả cho một thư mục. Bạn nên sử dụng cách này tốt nhất cho các thư mục nhỏ vì tất cả kết quả đều được lưu vào vùng đệm trong bộ nhớ. 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ị loại bỏ 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 làm vùng đệm listAll() kết quả trong bộ nhớ.

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

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 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 kết quả bổ sung.

Mã trang 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 bằng cách dùng pageToken, các mục xuất hiện sau khi pageToken được hiển thị.

Ví dụ sau đây minh hoạ việc phân trang kết quả:

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

Xử lý lỗi

list()listAll() sẽ không thành công nếu bạn chưa nâng cấp Quy tắc bảo mật cho phiên bản 2. Nâng cấp Quy tắc bảo mật nếu bạn thấy thông báo này lỗi:

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ề các lỗi trong Xử lý lỗi.