دانلود فایل ها با Cloud Storage در Flutter

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

یک مرجع ایجاد کنید

برای دانلود یک فایل، ابتدا یک مرجع Cloud Storage برای فایلی که می خواهید دانلود کنید ایجاد کنید .

می‌توانید با اضافه کردن مسیرهای فرزند به ریشه سطل فضای ذخیره‌سازی ابری خود، یک مرجع ایجاد کنید، یا می‌توانید از یک نشانی اینترنتی gs:// یا https:// موجود که به یک شی در فضای ذخیره‌سازی ابری ارجاع می‌دهد، یک مرجع ایجاد کنید.

// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

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

// Create a reference to a file from a Google Cloud Storage URI
final gsReference =
    FirebaseStorage.instance.refFromURL("gs://YOUR_BUCKET/images/stars.jpg");

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

دانلود فایل ها

هنگامی که یک مرجع دارید، می توانید با فراخوانی getData() یا getStream() فایل ها را از فضای ذخیره سازی ابری دانلود کنید. اگر ترجیح می دهید فایل را با کتابخانه دیگری دانلود کنید، می توانید یک URL دانلود با getDownloadUrl() دریافت کنید.

دانلود در حافظه

با متد getData() فایل را در UInt8List دانلود کنید. این ساده ترین راه برای دانلود یک فایل است، اما باید تمام محتویات فایل شما را در حافظه بارگیری کند. اگر فایلی بزرگتر از حافظه موجود برنامه خود درخواست کنید، برنامه شما خراب می شود. برای محافظت در برابر مشکلات حافظه، getData() حداکثر مقدار بایت را برای دانلود نیاز دارد. حداکثر اندازه را روی چیزی تنظیم کنید که می‌دانید برنامه‌تان از پس آن بر می‌آید، یا از روش دانلود دیگری استفاده کنید.

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

try {
  const oneMegabyte = 1024 * 1024;
  final Uint8List? data = await islandRef.getData(oneMegabyte);
  // Data for "images/island.jpg" is returned, use this as needed.
} on FirebaseException catch (e) {
  // Handle any errors.
}

دانلود به یک فایل محلی

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

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

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

دانلود داده ها از طریق URL

اگر از قبل زیرساخت دانلود مبتنی بر URLها دارید، یا فقط می‌خواهید یک URL برای اشتراک‌گذاری داشته باشید، می‌توانید URL دانلود یک فایل را با فراخوانی متد getDownloadURL() در مرجع ذخیره‌سازی ابری دریافت کنید.

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

رسیدگی به خطاها

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

مثال کامل

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

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

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

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