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

فضای ذخیره‌سازی ابری برای فایربیس به شما امکان می‌دهد تا به سرعت و به راحتی فایل‌ها را از یک مخزن فضای ذخیره‌سازی ابری که توسط فایربیس ارائه و مدیریت می‌شود، دانلود کنید.

ایجاد یک مرجع

برای دانلود یک فایل، ابتدا یک مرجع فضای ذخیره‌سازی ابری برای فایلی که می‌خواهید دانلود کنید ایجاد کنید .

شما می‌توانید با اضافه کردن مسیرهای فرزند به ریشه‌ی مخزن ذخیره‌سازی ابری خود، یک مرجع ایجاد کنید، یا می‌توانید از یک آدرس اینترنتی 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() فایل‌ها را از فضای ذخیره‌سازی ابری دانلود کنید. اگر ترجیح می‌دهید فایل را با کتابخانه دیگری دانلود کنید، می‌توانید با getDownloadUrl() یک URL دانلود دریافت کنید.

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

با استفاده از متد 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 برای اشتراک‌گذاری داشته باشید، می‌توانید با فراخوانی متد getDownloadURL() در یک مرجع ذخیره‌سازی ابری، URL دانلود یک فایل را دریافت کنید.

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

مدیریت خطاها

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

مثال کامل

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

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

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