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 にアップロードできます。
- メモリ内のバイト配列からアップロードする
- 端末上のファイルを表すファイルパスからアップロードする
メモリ内のデータからアップロードする
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()
メソッドとともに使用できます。詳しくは、アップロードの管理をご覧ください。
ファイル メタデータを追加する
ファイルをアップロードするときにメタデータを含めることもできます。このメタデータには、Name
、Size
、ContentType
(一般的に 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 からファイルをダウンロードする方法を学習しましょう。