Catch up on highlights from Firebase at Google I/O 2023. Learn more

تحميل الملفات باستخدام Cloud Storage لـ C ++

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

قم بإنشاء مرجع

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

يمكنك إنشاء مرجع من خلال إلحاق المسارات الفرعية بجذر حاوية التخزين السحابي الخاصة بك:

// Create a root reference
StorageReference storage_ref = storage->GetReference();

// Create a reference to "mountains.jpg"
StorageReference mountains_ref = storage_ref.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
StorageReference mountain_images_ref = storage_ref.Child("images/mountains.jpg");

// While the file names are the same, the references point to different files
mountains_ref.name() == mountain_images_ref.name();           // true
mountains_ref.full_path() == mountain_images_ref.full_path(); // false

لا يمكنك تحميل البيانات بالإشارة إلى جذر حاوية التخزين السحابي. يجب أن يشير مرجعك إلى عنوان URL التابع.

تحميل الملفات

بمجرد أن يكون لديك مرجع ، يمكنك تحميل الملفات إلى Cloud Storage بطريقتين:

  1. تحميل من مخزن بايت في الذاكرة
  2. تحميل من مسار ملف يمثل ملفًا على الجهاز

تحميل من البيانات في الذاكرة

طريقة PutData() هي أبسط طريقة لتحميل ملف إلى Cloud Storage. يأخذ PutData() مخزنًا مؤقتًا للبايت ويعيد Future<Metadata> والذي سيحتوي على معلومات حول الملف عند اكتمال المستقبل. يمكنك استخدام Controller لإدارة التحميل الخاص بك ومراقبة حالته.

// Data in memory
const size_t kByteBufferSize = ...
uint8_t byte_buffer[kByteBufferSize] = { ... };

// Create a reference to the file you want to upload
StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutBytes(byte_buffer, kByteBufferSize);

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

if (future.status() != firebase::kFutureStatusPending) {
  if (future.status() != firebase::kFutureStatusComplete) {
    LogMessage("ERROR: GetData() returned an invalid future.");
    // Handle the error...
  } else if (future.Error() != firebase::storage::kErrorNone) {
    LogMessage("ERROR: GetData() returned error %d: %s", future.Error(),
               future.error_message());
    // Handle the error...
    }
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    Metadata* metadata = future.Result();
    std::string download_url = metadata->download_url();
  }
}

تحميل من ملف محلي

يمكنك تحميل الملفات المحلية على الأجهزة ، مثل الصور ومقاطع الفيديو من الكاميرا ، باستخدام طريقة PutFile() . يأخذ PutFile() سلسلة std::string تمثل المسار إلى الملف وترجع Future<Metadata> والذي سيحتوي على معلومات حول الملف عند اكتمال المستقبل. يمكنك استخدام Controller لإدارة التحميل الخاص بك ومراقبة حالته.

// File located on disk
std::string local_file = ...

// Create a reference to the file you want to upload
StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
Future future = rivers_ref.PutFile(localFile);

// Wait for Future to complete...

if (future.Error() != firebase::storage::kErrorNone) {
  // Uh-oh, an error occurred!
} else {
  // Metadata contains file metadata such as size, content-type, and download URL.
  Metadata* metadata = future.Result();
  std::string download_url = metadata->download_url();
}

إذا كنت تريد إدارة التحميل بفاعلية ، فيمكنك توفير Controller لطريقة PutFile() أو PutBytes() . يتيح لك ذلك استخدام وحدة التحكم لمراقبة عملية التحميل الجارية. راجع إدارة التحميلات لمزيد من المعلومات.

أضف بيانات تعريف الملف

يمكنك أيضًا تضمين البيانات الوصفية عند تحميل الملفات. تحتوي هذه البيانات الأولية على خصائص البيانات الأولية للملف النموذجية مثل name size ونوع content_type (يشار إليه عادة باسم نوع MIME). تستنتج طريقة PutFile() نوع المحتوى تلقائيًا من امتداد اسم الملف ، ولكن يمكنك تجاوز نوع الاكتشاف التلقائي عن طريق تحديد content_type في البيانات الأولية. إذا لم تقدم content_type ولا يمكن لـ Cloud Storage استنتاج قيمة افتراضية من امتداد الملف ، فإن Cloud Storage يستخدم application/octet-stream . راجع قسم Use File Metadata للحصول على مزيد من المعلومات حول البيانات الأولية للملف.

// Create storage reference
StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg");

// Create file metadata including the content type
StorageMetadata metadata;
metadata.set_content_type("image/jpeg");

// Upload data and metadata
mountains_ref.PutBytes(data, metadata);

// Upload file and metadata
mountains_ref.PutFile(local_file, metadata);

إدارة التحميلات

بالإضافة إلى بدء التحميلات ، يمكنك إيقاف التحميلات مؤقتًا واستئنافها وإلغائها باستخدام طرق Pause() و Resume() و Cancel() على Controller ، والتي يمكنك تمريرها اختياريًا إلى طرق PutBytes() أو PutFile() .

// Start uploading a file
firebase::storage::Controller controller;
storage_ref.Child("images/mountains.jpg").PutFile(local_file, nullptr, &controller);

// Pause the upload
controller.Pause();

// Resume the upload
controller.Resume();

// Cancel the upload
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").PutFile(local_file, my_listener);
}

معالجة الأخطاء

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

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

الآن بعد أن قمت بتحميل الملفات ، دعنا نتعلم كيفية تنزيلها من Cloud Storage.