Cloud Storage for Unity でファイルをアップロードする

Cloud Storage を使用すると、デベロッパーは Firebase によって提供、管理される Google Cloud Storage バケットにファイルを迅速かつ容易にアップロードできます。

参照を作成する

ファイルをアップロードするには、まずアップロードするファイルへの Cloud Storage 参照を作成します。

ストレージ ルートに子パスを付加することによって参照を作成することも、Cloud Storage のオブジェクトを参照する既存の gs:// または https:// URL から参照を作成することもできます。

// Create a root reference
Firebase.Storage.StorageReference storage_ref = storage.Reference();

// Create a reference to "mountains.jpg"
Firebase.Storage.StorageReference mountains_ref = storage_ref.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
Firebase.Storage.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.Path == mountain_images_ref.Path; // false

Google Cloud Storage バケットのルートへの参照を指定してデータをアップロードすることはできません。参照は子 URL をポイントしている必要があります。

ファイルをアップロードする

参照を作成したら、次の 2 つの方法でファイルを Cloud Storage にアップロードできます。

  1. メモリ内のバイト配列からアップロードする
  2. 端末上のファイルを表すファイルパスからアップロードする

メモリ内のデータからアップロードする

PutBytesAsync() メソッドは、Cloud Storage にファイルをアップロードする最も簡単な方法です。PutBytesAsync() は byte[] を受け取って System.Task<Firebase.Storage.StorageMetadata> を返します。タスクが完了したとき、この中にファイルに関する情報が格納されます。必要に応じて、IProgress<UploadState>(通常は StorageProgress<UploadState>)を使用してアップロード ステータスをモニタリングできます。

// Data in memory
var custom_bytes = new byte[] { ... };

// Create a reference to the file you want to upload
Firebase.Storage.StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
rivers_ref.PutBytesAsync(custom_bytes)
  .ContinueWith ((Task<StorageMetadata> task) => {
    if (task.IsFaulted || task.IsCanceled) {
        Debug.Log(task.Exception.ToString());
        // Uh-oh, an error occurred!
    } else {
        // Metadata contains file metadata such as size, content-type, and download URL.
        Firebase.Storage.StorageMetadata metadata = task.Result;
        string download_url = metadata.DownloadUrl.ToString();
        Debug.Log("Finished uploading...");
        Debug.Log("download url = " + download_url);
    }
});

ローカル ファイルからのアップロード

カメラの写真や動画など、端末上のローカル ファイルを、PutFileAsync() メソッドを使ってアップロードできます。PutFileAsync() は、ファイルのパスを表す string を受け取って、System.Task<Firebase.Storage.StorageMetadata> を返します。タスクが完了したとき、この中にファイルに関する情報が格納されます。必要に応じて、IProgress<UploadState>(通常は StorageProgress<UploadState>)を使用してアップロード ステータスをモニタリングできます。

// File located on disk
string local_file = ...

// Create a reference to the file you want to upload
Firebase.Storage.StorageReference rivers_ref = storage_ref.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
rivers_ref.PutFileAsync(local_file)
  .ContinueWith ((Task<StorageMetadata> task) => {
    if (task.IsFaulted || task.IsCanceled) {
      Debug.Log(task.Exception.ToString());
      // Uh-oh, an error occurred!
    } else {
      // Metadata contains file metadata such as size, content-type, and download URL.
      Firebase.Storage.StorageMetadata metadata = task.Result;
      string download_url = metadata.DownloadUrl.ToString();
      Debug.Log("Finished uploading...");
      Debug.Log("download url = " + download_url);
    }
  });

アップロードを積極的にモニタリングする場合は、StorageProgress クラス、または IProgress<UploadState> を実装する独自のクラスと、PutFileAsync() または PutBytesAsync() メソッドを使用します。詳しくは、アップロードの管理をご覧ください。

ファイル メタデータを追加する

ファイルをアップロードするときにメタデータを含めることもできます。このメタデータには、NameSizeContentType(一般的に MIME タイプと呼ばれます)などの標準的なファイル メタデータのプロパティが含まれます。PutFileAsync() メソッドはファイル名拡張子からコンテンツ タイプを自動的に推測しますが、メタデータで ContentType を指定することにより、自動検出されたタイプをオーバーライドすることができます。ContentType が指定されず、ファイル拡張子からデフォルトのコンテンツ タイプを自動的に推測することもできないときは、application/octet-stream が使用されます。ファイル メタデータについて詳しくは、ファイル メタデータの使用のセクションをご覧ください。

// Create storage reference
Firebase.Storage.StorageReference mountains_ref = storage_ref.Child("images/mountains.jpg");

var custom_bytes = new byte[] { ... };

// Create file metadata including the content type
var new_metadata = new Firebase.Storage.MetadataChange();
new_metadata.ContentType = "image/jpeg";

// Upload data and metadata
mountains_ref.PutBytesAsync(custom_bytes, new_metadata, null,
                            CancellationToken.None, null);  // .ContinueWith(...
// Upload file and metadata
mountains_ref.PutFileAsync(local_file, new_metadata, null,
                           CancellationToken.None, null);  // .ContinueWith(...

アップロードの進捗状況をモニタリングする

アップロードの進捗状況をモニタリングするために、リスナーをアップロードにアタッチできます。リスナーは標準の System.IProgress<T> インターフェースに従います。StorageProgress クラスのインスタンスを使用して、進捗状況ティックを示すためのコールバックとして独自の Action<T> を提供できます。

// Start uploading a file
var task = storage_ref.Child("images/mountains.jpg")
    .PutFileAsync(local_file, null,
      new Firebase.Storage.StorageProgress<UploadState>(state => {
          // called periodically during the upload
          Debug.Log(String.Format("Progress: {0} of {1} bytes transferred.",
                             state.BytesTransferred, state.TotalByteCount));
      }), CancellationToken.None, null);

task.ContinueWith(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCancelled) {
        Debug.Log("Upload finished.");
    }
});

エラー処理

アップロード時にエラーが発生する理由として、ローカル ファイルが存在しない、目的のファイルをアップロードする権限がユーザーにないなど、たくさんの理由が考えられます。エラーについて詳しくは、このドキュメントのエラーの処理のセクションをご覧ください。

次のステップ

これでファイルのアップロードが完了しました。次は、Cloud Storage からファイルをダウンロードする方法を学習しましょう。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。