Cloud Storage for Firebase を使用すると、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 を指し示す必要があります。
ファイルのアップロード
参照を取得したら、次の 2 つの方法でファイルを 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);
この時点でリクエストは行われていますが、ファイルのアップロードの前に Future が完了するのを待つ必要があります。通常はループ内でゲームが動作し、他のアプリケーションよりもコールバックが少なくなります。このため、一般的には、完了をポーリングします。
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
を使用します。ファイル メタデータの詳細については、ファイル メタデータの使用のセクションをご覧ください。
// 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);
アップロードを管理する
アップロードを開始するだけでなく、Controller
で Pause()
、Resume()
、Cancel()
メソッドを使用してアップロードを一時停止、再開、キャンセルすることもできます。これは、必要に応じて 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 からファイルをダウンロードする方法を学習しましょう。