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

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

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

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

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

// Create a reference with an initial file path and name
StorageReference path_reference = storage->GetReference("images/stars.jpg");

// Create a reference from a Cloud Storage URI
StorageReference gs_reference = storage->GetReferenceFromUrl("gs://bucket/images/stars.jpg");

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

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

هنگامی که یک مرجع دارید، می توانید فایل ها را از Cloud Storage به سه روش دانلود کنید:

  1. دانلود در یک بافر در حافظه
  2. دانلود به یک مسیر خاص در دستگاه
  3. یک URL رشته ای که فایل را به صورت آنلاین نشان می دهد ایجاد کنید

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

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

// Create a reference to the file you want to download
StorageReference island_ref = storage_ref.Child("images/island.jpg");

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const size_t kMaxAllowedSize = 1 * 1024 * 1024
int8_t byte_buffer[kMaxAllowedSize];
firebase::Future<size_t> future = island_ref.GetBytes(byte_buffer, kMaxAllowedSize);

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

// In the game loop that polls for the result...

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetBytes() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetBytes() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
  } else {
    // byte_buffer is now populated with data for "images/island.jpg"
  }
}

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

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

// Create a reference to the file you want to download
StorageReference islandRef = storage_ref.Child("images/island.jpg"];

// Create local filesystem URL
const char* local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
Future<size_t> future = islandRef.GetFile(local_url);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // The file has been downloaded to local file URL "images/island.jpg"
}

GetFile() یک آرگومان Controller اختیاری می گیرد که می توانید از آن برای مدیریت دانلود خود استفاده کنید. برای اطلاعات بیشتر به مدیریت دانلودها مراجعه کنید.

یک URL دانلود ایجاد کنید

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

// Create a reference to the file you want to download
StorageReference stars_ref = storage_ref.Child("images/stars.jpg");

// Fetch the download URL
firebase::Future<std::string> future = stars_ref.GetDownloadUrl();

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Get the download URL for 'images/stars.jpg'
  std::string download_url = future.Result();
}

مدیریت دانلودها

علاوه بر شروع دانلودها، می توانید با استفاده از متدهای Pause() ، Resume() و Cancel() در Controller ، دانلودها را متوقف کنید، از سر بگیرید و لغو کنید، که می توانید به صورت اختیاری به متدهای GetBytes() یا GetFile() منتقل کنید.

// Start downloading a file
Controller controller;
storage_ref.Child("images/mountains.jpg").GetFile(local_file, nullptr, &controller);

// Pause the download
controller.Pause();

// Resume the download
controller.Resume();

// Cancel the download
controller.Cancel();

نظارت بر پیشرفت دانلود

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

class MyListener : public firebase::storage::Listener {
 public:
  virtual void OnProgress(firebase::storage::Controller* controller) {
    // A progress event occurred
  }
};

{
  // Start uploading a file
  MyEventListener my_listener;
  storage_ref.Child("images/mountains.jpg").GetFile(local_file, my_listener);
}

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

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

مراحل بعدی

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