Cloud Storage for Firebase به شما این امکان را می دهد که به سرعت و به راحتی فایل ها را در یک سطل Cloud Storage که توسط Firebase تهیه و مدیریت می شود آپلود کنید.
یک مرجع ایجاد کنید
برای آپلود یک فایل، ابتدا یک مرجع 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 خود آپلود کنید. مرجع شما باید به نشانی اینترنتی فرزند اشاره داشته باشد.
آپلود فایل ها
هنگامی که یک مرجع دارید، می توانید فایل ها را به دو روش در 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);
در نقطه ای که درخواست انجام شده است، اما باید منتظر بمانیم تا آینده تکمیل شود تا فایل بارگذاری شود. از آنجایی که بازیها معمولاً در یک حلقه اجرا میشوند و نسبت به سایر برنامهها کمتر پاسخگوی تماس هستند، معمولاً برای تکمیل نظرسنجی انجام میدهید.
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()
ارائه کنید. این به شما امکان می دهد از کنترلر برای مشاهده عملیات بارگذاری مداوم استفاده کنید. برای اطلاعات بیشتر به مدیریت آپلودها مراجعه کنید.
افزودن فراداده فایل
همچنین میتوانید هنگام آپلود فایلها، متادیتا را نیز اضافه کنید. این ابرداده حاوی ویژگیهای معمولی فراداده فایل مانند 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); }
رسیدگی به خطا
دلایل متعددی وجود دارد که ممکن است هنگام آپلود خطا رخ دهد، از جمله اینکه فایل محلی موجود نیست یا کاربر مجوز آپلود فایل مورد نظر را ندارد. اطلاعات بیشتر درباره خطاها را می توانید در بخش Handle Errors در اسناد بیابید.
مراحل بعدی
اکنون که فایلها را آپلود کردید، بیاموزیم که چگونه آنها را از Cloud Storage دانلود کنیم.