قم بتنزيل الملفات باستخدام Cloud Storage لـ C++

يتيح لك Cloud Storage for Firebase تنزيل الملفات بسرعة وسهولة من مجموعة Cloud Storage التي توفرها وتديرها Firebase.

إنشاء مرجع

لتنزيل ملف، قم أولاً بإنشاء مرجع Cloud Storage للملف الذي تريد تنزيله.

يمكنك إنشاء مرجع عن طريق إلحاق مسارات فرعية بجذر مجموعة Cloud Storage، أو يمكنك إنشاء مرجع من عنوان URL موجود 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 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 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() على مرجع التخزين السحابي.

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

التعامل مع الأخطاء

هناك عدد من الأسباب التي قد تؤدي إلى حدوث أخطاء عند التنزيل، بما في ذلك الملف غير موجود، أو عدم حصول المستخدم على إذن للوصول إلى الملف المطلوب. يمكن العثور على مزيد من المعلومات حول الأخطاء في قسم التعامل مع الأخطاء في المستندات.

الخطوات التالية

يمكنك أيضًا الحصول على البيانات التعريفية للملفات المخزنة في Cloud Storage وتحديثها .