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 آپلود کنید:
- آپلود از یک بافر بایتی در حافظه
- آپلود از یک مسیر فایل که نشاندهنده فایل روی دستگاه است
آپلود از دادههای موجود در حافظه
The PutData() method is the simplest way to upload a file to Cloud Storage . PutData() takes a byte buffer and returns a Future<Metadata> which will contain information about the file when the Future completes. You can use a Controller to manage your upload and monitor its status.
// 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() اختصاص دهید. این به شما امکان میدهد از کنترلر برای مشاهده عملیات آپلود در حال انجام استفاده کنید. برای اطلاعات بیشتر به بخش مدیریت آپلودها مراجعه کنید.
افزودن متادیتای فایل
You can also include metadata when you upload files. This metadata contains typical file metadata properties such as name , size , and content_type (commonly referred to as MIME type). The PutFile() method automatically infers the content type from the filename extension, but you can override the auto-detected type by specifying content_type in the metadata. If you do not provide a content_type and Cloud Storage cannot infer a default from the file extension, Cloud Storage uses application/octet-stream . See the Use File Metadata section for more information about 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 دانلود کنیم.