Cloud Storage for Firebase به شما امکان میدهد تا به سرعت و به راحتی فایلها را در یک مخزن Cloud Storage که توسط فایربیس ارائه و مدیریت میشود، آپلود کنید.
ایجاد یک مرجع
برای آپلود فایل، ابتدا یک مرجع Cloud Storage برای مکانی در 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
شما نمیتوانید دادهها را با ارجاع به ریشهی مخزن Cloud Storage خود آپلود کنید. ارجاع شما باید به یک URL فرزند اشاره کند.
آپلود فایلها
وقتی مرجع را پیدا کردید، میتوانید فایلها را به دو روش در Cloud Storage آپلود کنید:
- آپلود از یک بافر بایتی در حافظه
- آپلود از یک مسیر فایل که نشاندهنده فایل روی دستگاه است
آپلود از دادههای موجود در حافظه
متد PutData() سادهترین راه برای آپلود فایل در Cloud Storage است. PutData() یک بافر بایتی میگیرد و یک Future<Metadata> برمیگرداند که شامل اطلاعاتی در مورد فایل پس از اتمام Future خواهد بود. میتوانید از یک 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);
در این مرحله، درخواست ارسال شده است، اما باید منتظر بمانیم تا Future قبل از آپلود فایل، تکمیل شود. از آنجایی که بازیها معمولاً در یک حلقه اجرا میشوند و نسبت به سایر برنامهها کمتر به فراخوانیهای برگشتی نیاز دارند، معمولاً برای تکمیل، نظرسنجی (polle) انجام میشود.
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> برمیگرداند که شامل اطلاعاتی در مورد فایل پس از اتمام Future خواهد بود. میتوانید از یک 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() اختصاص دهید. این به شما امکان میدهد از کنترلر برای مشاهده عملیات آپلود در حال انجام استفاده کنید. برای اطلاعات بیشتر به بخش مدیریت آپلودها مراجعه کنید.
افزودن متادیتای فایل
همچنین میتوانید هنگام آپلود فایلها، فراداده (metadata) را نیز اضافه کنید. این فراداده شامل ویژگیهای معمول فراداده فایل مانند name ، size و content_type ) (که معمولاً به عنوان نوع MIME شناخته میشود) است. متد PutFile() به طور خودکار نوع محتوا را از پسوند نام فایل استنباط میکند، اما میتوانید با مشخص کردن content_type در فراداده، نوع شناساییشده خودکار را لغو کنید. اگر content_type مشخص نکنید و Cloud Storage نتواند پیشفرض را از پسوند فایل استنباط کند، Cloud Storage از application/octet-stream استفاده میکند. برای اطلاعات بیشتر در مورد فراداده فایل، به بخش استفاده از فراداده فایل مراجعه کنید.
// 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 دانلود کنیم.