Check out what’s new from Firebase at Google I/O 2022. Learn more

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

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

参照を作成する

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

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

// Create a root reference
StorageReference storageRef = storage.RootReference;

// Create a reference to "mountains.jpg"
StorageReference mountainsRef = storageRef.Child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
StorageReference mountainImagesRef =
    storageRef.Child("images/mountains.jpg");

// While the file names are the same, the references point to different files
Assert.AreEqual(mountainsRef.Name, mountainImagesRef.Name);
Assert.AreNotEqual(mountainsRef.Path, mountainImagesRef.Path);

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 customBytes = new byte[] {
    /*...*/
};

// Create a reference to the file you want to upload
StorageReference riversRef = storageRef.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
riversRef.PutBytesAsync(customBytes)
    .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 md5hash.
            StorageMetadata metadata = task.Result;
            string md5Hash = metadata.Md5Hash;
            Debug.Log("Finished uploading...");
            Debug.Log("md5 hash = " + md5Hash);
        }
    });

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

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

// File located on disk
string localFile = "...";

// Create a reference to the file you want to upload
StorageReference riversRef = storageRef.Child("images/rivers.jpg");

// Upload the file to the path "images/rivers.jpg"
riversRef.PutFileAsync(localFile)
    .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.
            StorageMetadata metadata = task.Result;
            string md5Hash = metadata.Md5Hash;
            Debug.Log("Finished uploading...");
            Debug.Log("md5 hash = " + md5Hash);
        }
    });

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

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

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

// Create storage reference
StorageReference mountainsRef = storageRef.Child("images/mountains.jpg");

byte[] customBytes = new byte[] {
    /*...*/
};
string localFile = "...";

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

// Upload data and metadata
mountainsRef.PutBytesAsync(customBytes, newMetadata, null,
    CancellationToken.None); // .ContinueWithOnMainThread(...
// Upload file and metadata
mountainsRef.PutFileAsync(localFile, newMetadata, null,
    CancellationToken.None); // .ContinueWithOnMainThread(...

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

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

// Start uploading a file
var task = storageRef.Child("images/mountains.jpg")
    .PutFileAsync(localFile, null,
        new 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.ContinueWithOnMainThread(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
        Debug.Log("Upload finished.");
    }
});

エラー処理

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

次のステップ

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