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

Cloud Storage for Firebase به شما امکان می‌دهد به‌سرعت و به‌آسانی فایل‌ها را از یک سطل Cloud Storage که توسط Firebase ارائه و مدیریت می‌شود بارگیری کنید.

ایجاد مرجع

برای بارگیری فایل، ابتدا مرجع Cloud Storage ایجاد کنید تا فایل موردنظرتان بارگیری شود.

می‌توانید با افزودن مسیرهای فرزند به ریشه Cloud Storage bucket، مرجع ایجاد کنید یا می‌توانید از نشانی وب موجود gs:// یا https:// که به شیء در Cloud Storage ارجاع می‌دهد، مرجع ایجاد کنید.

Kotlin

// Create a storage reference from our app
val storageRef = storage.reference

// Create a reference with an initial file path and name
val pathReference = storageRef.child("images/stars.jpg")

// Create a reference to a file from a Google Cloud Storage URI
val gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg")

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
val httpsReference = storage.getReferenceFromUrl(
    "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg",
)

Java

// Create a storage reference from our app
StorageReference storageRef = storage.getReference();

// Create a reference with an initial file path and name
StorageReference pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
StorageReference gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference httpsReference = storage.getReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

بارگیری فایل‌ها

وقتی مرجع را دریافت کردید، می‌توانید با فراخوانی getBytes() یا getStream()، فایل‌ها را از Cloud Storage بارگیری کنید. اگر ترجیح می‌دهید فایل را با کتابخانه دیگری بارگیری کنید، می‌توانید نشانی وب بارگیری را با getDownloadUrl() دریافت کنید.

بارگیری در حافظه

فایل را با روش getBytes() در byte[] بارگیری کنید. این ساده‌ترین راه برای بارگیری فایل است، اما باید کل محتوای فایل را در حافظه بار کند. اگر فایلی بزرگ‌تر از حافظه دردسترس برنامه‌تان درخواست کنید، برنامه‌تان ازکار خواهد افتاد. برای محافظت دربرابر مشکلات حافظه، getBytes() حداکثر مقدار بایت را برای بارگیری می‌گیرد. حداکثر اندازه را روی مقداری تنظیم کنید که می‌دانید برنامه‌تان می‌تواند مدیریت کند، یا از روش بارگیری دیگری استفاده کنید.

Kotlin

var islandRef = storageRef.child("images/island.jpg")

val ONE_MEGABYTE: Long = 1024 * 1024
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener {
    // Data for "images/island.jpg" is returned, use this as needed
}.addOnFailureListener {
    // Handle any errors
}

Java

StorageReference islandRef = storageRef.child("images/island.jpg");

final long ONE_MEGABYTE = 1024 * 1024;
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Data for "images/island.jpg" is returns, use this as needed
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

بارگیری در فایل محلی

روش getFile() فایل را مستقیماً در دستگاه محلی بارگیری می‌کند. اگر کاربران شما می‌خواهند درحالت آفلاین به فایل دسترسی داشته باشند یا فایل را در برنامه دیگری هم‌رسانی کنند، از این روش استفاده کنید. getFile() یک DownloadTask برمی‌گرداند که می‌توانید از آن برای مدیریت بارگیری و نظارت بر وضعیت بارگیری استفاده کنید.

Kotlin

islandRef = storageRef.child("images/island.jpg")

val localFile = File.createTempFile("images", "jpg")

islandRef.getFile(localFile).addOnSuccessListener {
    // Local temp file has been created
}.addOnFailureListener {
    // Handle any errors
}

Java

islandRef = storageRef.child("images/island.jpg");

File localFile = File.createTempFile("images", "jpg");

islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
        // Local temp file has been created
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

اگر می‌خواهید بارگیری‌تان را به‌طور فعال مدیریت کنید، برای اطلاعات بیشتر به مدیریت بارگیری‌ها مراجعه کنید.

بارگیری داده‌ها ازطریق نشانی وب

If you already have download infrastructure based around URLs, or just want a URL to share, you can get the download URL for a file by calling the getDownloadUrl() method on a Cloud Storage reference.

Kotlin

storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener {
    // Got the download URL for 'users/me/profile.png'
}.addOnFailureListener {
    // Handle any errors
}

Java

storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        // Got the download URL for 'users/me/profile.png'
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

بارگیری تصاویر با FirebaseUI

FirebaseUI اتصالات تلفن همراه بومی ساده، سفارشی‌سازی‌شدنی، و آماده تولید ارائه می‌دهد تا کد متن استاندارد را حذف کند و روال‌های مطلوب Google را ترویج دهد. بااستفاده از FirebaseUI می‌توانید به‌سرعت و به‌آسانی تصاویر را از Cloud Storage بارگیری، ذخیره موقت، و نمایش دهید بااستفاده از ادغام ما با Glide.

ابتدا FirebaseUI را به app/build.gradle اضافه کنید:

dependencies {
    // FirebaseUI Storage only
    implementation 'com.firebaseui:firebase-ui-storage:9.0.0'
}

سپس می‌توانید تصاویر را مستقیماً از Cloud Storage در ImageView بار کنید:

Kotlin

// Reference to an image file in Cloud Storage
val storageReference = Firebase.storage.reference

// ImageView in your Activity
val imageView = findViewById<ImageView>(R.id.imageView)

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
Glide.with(context)
    .load(storageReference)
    .into(imageView)

Java

// Reference to an image file in Cloud Storage
StorageReference storageReference = FirebaseStorage.getInstance().getReference();

// ImageView in your Activity
ImageView imageView = findViewById(R.id.imageView);

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
Glide.with(context)
        .load(storageReference)
        .into(imageView);

مدیریت تغییرات چرخه حیات فعالیت

بارگیری‌ها حتی پس‌از تغییرات چرخه حیات فعالیت (مانند ارائه کادر گفتگو یا چرخاندن صفحه‌نمایش) در پس‌زمینه ادامه می‌یابند. هر شنونده‌ای که پیوست کرده بودید نیز پیوست‌شده باقی خواهد ماند. اگر این روش‌ها پس‌از توقف فعالیت فراخوانی شوند، ممکن است نتایج غیرمنتظره‌ای ایجاد کنند.

می‌توانید این مشکل را با مشترک کردن شنوندگان خود با یک دامنه فعالیت حل کنید تا وقتی فعالیت متوقف می‌شود، به‌طور خودکار ثبت‌نام آن‌ها لغو شود. سپس، وقتی فعالیت دوباره شروع شد، از روش getActiveDownloadTasks برای دریافت تکالیف بارگیری که هنوز درحال اجرا هستند یا اخیراً تکمیل شده‌اند استفاده کنید.

مثال زیر این موضوع را نشان می‌دهد و همچنین نحوه حفظ مسیر مرجع فضای ذخیره‌سازی استفاده‌شده را نشان می‌دهد.

Kotlin

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)

    // If there's a download in progress, save the reference so you can query it later
    outState.putString("reference", storageRef.toString())
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)

    // If there was a download in progress, get its reference and create a new StorageReference
    val stringRef = savedInstanceState.getString("reference") ?: return

    storageRef = Firebase.storage.getReferenceFromUrl(stringRef)

    // Find all DownloadTasks under this StorageReference (in this example, there should be one)
    val tasks = storageRef.activeDownloadTasks

    if (tasks.size > 0) {
        // Get the task monitoring the download
        val task = tasks[0]

        // Add new listeners to the task using an Activity scope
        task.addOnSuccessListener(this) {
            // Success!
            // ...
        }
    }
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // If there's a download in progress, save the reference so you can query it later
    if (mStorageRef != null) {
        outState.putString("reference", mStorageRef.toString());
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // If there was a download in progress, get its reference and create a new StorageReference
    final String stringRef = savedInstanceState.getString("reference");
    if (stringRef == null) {
        return;
    }
    mStorageRef = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef);

    // Find all DownloadTasks under this StorageReference (in this example, there should be one)
    List<FileDownloadTask> tasks = mStorageRef.getActiveDownloadTasks();
    if (tasks.size() > 0) {
        // Get the task monitoring the download
        FileDownloadTask task = tasks.get(0);

        // Add new listeners to the task using an Activity scope
        task.addOnSuccessListener(this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot state) {
                // Success!
                // ...
            }
        });
    }
}

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

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

نمونه کامل

نمونه کاملی از بارگیری با مدیریت خطا در زیر نشان داده شده است:

Kotlin

storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener {
    // Use the bytes to display the image
}.addOnFailureListener {
    // Handle any errors
}

Java

storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Use the bytes to display the image
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

همچنین می‌توانید برای فایل‌هایی که در Cloud Storage ذخیره شده‌اند، فراداده دریافت و به‌روز کنید.