فهرست کردن فایل‌ها با Cloud Storage در Android

Cloud Storage for Firebase به شما امکان می‌دهد محتویات Cloud Storage bucket را فهرست کنید. کیت‌های توسعه نرم‌افزار هم موارد و هم پیشوندهای اشیاء را تحت مرجع Cloud Storage فعلی برمی‌گردانند.

پروژه‌هایی که از List API استفاده می‌کنند به Cloud Storage for Firebase نسخه ۲ قوانین نیاز دارند. اگر پروژه Firebase موجودی دارید، مراحل موجود در راهنمای قوانین امنیتی را دنبال کنید.

list() از Google Cloud Storage List API استفاده می‌کند. در Cloud Storage for Firebase، از / به‌عنوان جداکننده استفاده می‌کنیم که به ما امکان می‌دهد معناشناسی سیستم فایل را شبیه‌سازی کنیم. برای امکان پیمایش کارآمد در گروه‌های بزرگ و سلسله‌مراتبی Cloud Storage، «میانای برنامه‌سازی کاربردی فهرست» پیشوندها و موارد را به‌طور جداگانه برمی‌گرداند. برای مثال، اگر یک فایل /images/uid/file1 بارگذاری کنید،

  • root.child('images').listAll() /images/uid را به‌عنوان پیشوند برمی‌گرداند.
  • ‫root.child('images/uid').listAll() فایل را به‌عنوان یک مورد برمی‌گرداند.

کیت توسعه نرم‌افزار Cloud Storage for Firebase مسیرهای شیء را که حاوی دو / متوالی باشند یا به / ختم شوند برنمی‌گرداند. برای مثال، دسته‌ای را درنظر بگیرید که اشیاء زیر را دارد:

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

عملیات فهرست روی موارد موجود در این دسته نتایج زیر را ارائه می‌دهد:

  • عملیات فهرست در ریشه، ارجاع‌ها به correctPrefix، wrongPrefix، و lonelyItem را به‌عنوان prefixes برمی‌گرداند.
  • عملیات فهرست در correctPrefix/، مرجع‌ها را به correctPrefix/happyItem به‌عنوان items برمی‌گرداند.
  • عملیات فهرست در wrongPrefix/ هیچ مرجعی را برنمی‌گرداند زیرا wrongPrefix//sadItem حاوی دو / متوالی است.
  • عملیات فهرست در lonelyItem/ هیچ مرجعی را برنمی‌گرداند زیرا شیء lonelyItem/ با / به‌پایان می‌رسد.

فهرست کردن همه فایل‌ها

می‌توانید از listAll برای واکشی همه نتایج یک دایرکتوری استفاده کنید. این گزینه برای دایرکتوری‌های کوچک بهترین کاربرد را دارد زیرا همه نتایج در حافظه میان‌گیر می‌شوند. همچنین اگر اشیاء درطول فرایند اضافه یا حذف شوند، ممکن است عملیات عکس آنی ثابتی را برنگرداند.

برای فهرست‌های بزرگ، از روش صفحه‌بندی‌شده list() استفاده کنید زیرا listAll() همه نتایج را در حافظه میان‌گیر می‌کند.

مثال زیر listAll را نشان می‌دهد.

Kotlin

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

صفحه‌بندی نتایج فهرست

list() API برای تعداد نتایجی که برمی‌گرداند محدودیت تعیین می‌کند. list() نمای صفحه ثابتی ارائه می‌دهد و pageToken را نمایش می‌دهد که امکان کنترل بر زمان واکشی نتایج بیشتر را فراهم می‌کند.

‫pageToken مسیر و نسخه آخرین مورد برگردانده‌شده در نتیجه قبلی را کدگذاری می‌کند. در درخواست بعدی بااستفاده از pageToken، مواردی که بعداز pageToken می‌آیند نشان داده می‌شوند.

مثال زیر صفحه‌بندی نتیجه را نشان می‌دهد:

Kotlin

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

مدیریت کردن خطاها

اگر «قوانین امنیتی» را به نسخه ۲ ارتقا نداده باشید، list() و listAll() ناموفق خواهند بود. اگر این خطا را دیدید، «قوانین امنیتی» خود را ارتقا دهید:

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

خطاهای احتمالی دیگر ممکن است نشان دهد که کاربر اجازه لازم را ندارد. اطلاعات بیشتر درباره خطاها را می‌توانید در رسیدگی به خطاها پیدا کنید.