يتيح لك 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 بطريقتين:
- تحميل من مخزن بايت في الذاكرة
- تحميل من مسار ملف يمثل ملفًا على الجهاز
تحميل من البيانات في الذاكرة
طريقة 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" Futurefuture = 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" Futurefuture = 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.