Mengupload File dengan Cloud Storage untuk C++

Dengan Cloud Storage for Firebase, Anda dapat mengupload file dengan cepat dan mudah ke bucket Cloud Storage yang disediakan dan dikelola oleh Firebase.

Membuat Referensi

Untuk mengupload file, buat referensi Cloud Storage terlebih dahulu ke lokasi tempat Anda ingin mengupload file di Cloud Storage.

Anda dapat membuat referensi dengan menambahkan jalur turunan ke root bucket 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

Anda tidak bisa mengupload data dengan referensi ke root bucket Cloud Storage. Referensi Anda harus mengarah ke URL turunan.

Mengupload File

Setelah memiliki referensi, Anda bisa mengupload file ke Cloud Storage dengan dua cara:

  1. Mengupload dari buffering byte di memori
  2. Mengupload dari lokasi file yang mewakili file pada perangkat

Mengupload dari data di memori

Metode PutData() adalah cara termudah untuk mengupload file ke Cloud Storage. PutData() mengambil buffering byte dan menampilkan Future<Metadata> yang akan memuat informasi mengenai file tersebut saat Future selesai. Anda dapat menggunakan Controller untuk mengelola upload dan memantau statusnya.

// 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);

Pada saat itu, permintaan telah dibuat, tetapi harus menunggu Future selesai sebelum file diupload. Karena game biasanya dijalankan dalam loop, dan tidak begitu berbasis callback dibanding aplikasi lain, Anda biasanya akan menanyakan penyelesaian.

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();
  }
}

Mengupload dari file lokal

Anda dapat mengupload file lokal pada perangkat, seperti foto dan video dari kamera, dengan metode PutFile(). PutFile() mengambil std::string yang mewakili jalur file dan menampilkan Future<Metadata> yang akan memuat informasi mengenai file tersebut saat Future selesai. Anda dapat menggunakan Controller untuk mengelola upload dan memantau statusnya.

// 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();
}

Jika ingin mengelola upload secara aktif, Anda dapat menyediakan Controller ke metode PutFile() atau PutBytes(). Hal ini memungkinkan Anda menggunakan pengontrol untuk mengamati operasi upload yang sedang berlangsung. Baca bagian Mengelola Upload untuk mengetahui informasi lebih lanjut.

Menambahkan Metadata File

Anda juga dapat menyertakan metadata ketika mengupload file. Metadata ini berisi properti metadata file standar, seperti name, size, dan content_type (umumnya dikenal sebagai jenis MIME). Metode PutFile() secara otomatis menyimpulkan jenis konten dari ekstensi nama file, tetapi Anda dapat mengganti jenis konten yang dideteksi secara otomatis dengan menentukan content_type dalam metadata. Jika content_type tidak ada dan Cloud Storage tidak dapat menyimpulkan default dari ekstensi file, Cloud Storage akan menggunakan application/octet-stream. Baca bagian Menggunakan Metadata File untuk mengetahui informasi lebih lanjut mengenai metadata file.

// 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);

Mengelola Upload

Selain memulai upload, Anda dapat menjeda, melanjutkan, dan membatalkan upload menggunakan metode Pause(), Resume(), dan Cancel() di Controller, yang dapat Anda teruskan secara opsional ke metode PutBytes() atau 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();

Memantau Progres Upload

Anda dapat memasang pemroses ke upload untuk memantau progres upload.

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);
}

Penanganan Error

Ada sejumlah penyebab terjadinya error saat upload, termasuk tidak adanya file lokal, atau pengguna tidak memiliki izin untuk mengupload file yang diinginkan. Anda dapat menemukan informasi lebih lanjut tentang error di bagian Menangani Error pada dokumentasi.

Langkah Berikutnya

Setelah mengupload file, pelajari cara mendownloadnya dari Cloud Storage.