Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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>を実装する StorageProgress クラスまたは独自のクラスをPutFileAsync()またはPutBytesAsync()メソッドで使用できます。詳細については、アップロードの管理を参照してください。

ファイル メタデータの追加

ファイルをアップロードするときにメタデータを含めることもできます。このメタデータには、 NameSizeContentType (一般に MIME タイプと呼ばれる) などの一般的なファイル メタデータ プロパティが含まれています。 PutFileAsync()メソッドは、ファイル名拡張子からコンテンツ タイプを自動的に推測しますが、メタデータでContentTypeを指定することにより、自動検出されたタイプをオーバーライドできます。 ContentTypeを指定せず、Cloud Storage がファイル拡張子からデフォルトを推測できない場合、Cloud Storage は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 からファイルをダウンロードする方法を学びましょう。