تنزيل الملفات باستخدام 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() في مرجع 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 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.