Buka konsol

Mengupload File dengan Cloud Storage untuk C++

Cloud Storage memungkinkan developer untuk mengupload file dengan cepat dan mudah ke bucket Google 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 bisa membuat referensi dengan menambahkan lokasi turunan ke root penyimpanan:

// 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 Google 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() merupakan cara paling sederhana untuk mengupload file ke Firebase Storage. PutData() menggunakan buffering byte dan mengembalikan Future<Metadata> yang akan berisi informasi tentang file ketika 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 kurang digerakkan 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() menggunakan std::string yang mewakili lokasi ke file dan menampilkan Future<Metadata> yang akan berisi informasi tentang file ketika 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 secara aktif mengelola upload, Anda dapat menyediakan Controller pada metode PutFile() atau PutBytes(). Hal ini memungkinkan Anda menggunakan pengontrol untuk mengamati operasi upload yang sedang berlangsung. Lihat Mengelola Upload untuk informasi lebih lanjut.

Menambahkan Metadata File

Anda juga bisa 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 bisa mengganti jenis file yang terdeteksi otomatis dengan menetapkan content_type pada metadata. Jika Anda tidak memberikan content_type dan Cloud Storage tidak dapat menyimpulkan default dari ekstensi file, Cloud Storage akan menggunakan application/octet-stream. Lihat Menggunakan Metadata File untuk informasi lebih lanjut tentang 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() pada Controller, yang secara opsional dapat diteruskan 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 Kemajuan Upload

Anda dapat memasang listener ke upload untuk memantau kemajuan 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 alasan 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.