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/happyItemwrongPrefix//sadItemlonelyItem/
عملیات فهرست روی موارد موجود در این دسته نتایج زیر را ارائه میدهد:
- عملیات فهرست در ریشه، ارجاعها به
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.
خطاهای احتمالی دیگر ممکن است نشان دهد که کاربر اجازه لازم را ندارد. اطلاعات بیشتر درباره خطاها را میتوانید در رسیدگی به خطاها پیدا کنید.