فایل‌ها را با فضای ذخیره‌سازی ابری برای C++ آپلود کنید

Cloud Storage for Firebase به شما این امکان را می دهد که به سرعت و به راحتی فایل ها را در یک سطل Cloud Storage که توسط 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

نمی‌توانید داده‌ها را با ارجاع به ریشه سطل فضای ذخیره‌سازی ابری خود آپلود کنید. مرجع شما باید به نشانی اینترنتی فرزند اشاره داشته باشد.

آپلود فایل ها

هنگامی که یک مرجع دارید، می توانید فایل ها را به دو روش در فضای ذخیره سازی ابری آپلود کنید:

  1. آپلود از یک بافر بایت در حافظه
  2. آپلود از مسیر فایلی که نشان دهنده یک فایل در دستگاه است

آپلود از داده ها در حافظه

متد PutData() ساده ترین راه برای آپلود فایل در فضای ذخیره سازی ابری است. 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"
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> را برمی گرداند که پس از تکمیل 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"
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);
}

رسیدگی به خطا

دلایل متعددی وجود دارد که ممکن است هنگام آپلود خطا رخ دهد، از جمله اینکه فایل محلی موجود نیست یا کاربر مجوز آپلود فایل مورد نظر را ندارد. اطلاعات بیشتر درباره خطاها را می توانید در بخش Handle Errors در اسناد بیابید.

مراحل بعدی

اکنون که فایل‌ها را آپلود کردید، بیایید نحوه دانلود آنها را از فضای ذخیره‌سازی ابری بیاموزیم.