[C#] Azure.Storage.Blobsでファイル操作

C#でAzure.Storage.Blobsを使い、ストレージアカウントに作成済みのコンテナに対して、

- ファイルのダウンロード
- ファイルのアップロード
- ファイルの削除

する処理を書いたので、備忘録として。

# 環境

* フレームワーク：.NET Framework 4.8
* Nugetパッケージ
    * Azure.Storage.Blobs v12.19.1
  

# コード全体
```csharp
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System;
using System.IO;
using System.Threading.Tasks;

namespace MyApp.Utils
{
    public class StorageAccountHelper
    {
        private static string connectionString = "接続文字列";
        private static string blobContainerName = "コンテナ名";

        // 渡されたbloblNameへのアクセスを行うBlobClientを作成する
        private static BlobClient CreateBlobClient(string blobName)
        {
            return new BlobClient(connectionString, blobContainerName, blobName);
        }
        
        // ファイルダウンロード
        public static async Task<FileInfo> DownloadAsync(string fileName)
        {
            BlobClient blobClient = CreateBlobClient(fileName);
            
            // ファイル名が一致するものがあるかどうかを確認
            Azure.Response<bool> isBlobExists = await blobClient.ExistsAsync();
            if (!isBlobExists.Value)
            {
                throw new Exception("ファイルが見つかりません。");
            }

            // ファイルをダウンロードする
            Azure.Response<BlobDownloadResult> blobDownloadResult = await blobClient.DownloadContentAsync();
            if (blobDownloadResult.GetRawResponse().IsError)
            {
                throw new Exception("ファイルのダウンロードに失敗しました。");
            }

            // ファイルのデータを取り出して返す
            FileInfo fileInfo = new FileInfo();
            fileInfo.content = blobDownloadResult.Value.Content.ToArray();
            fileInfo.contentType = blobDownloadResult.Value.Details.ContentType;
            return fileInfo;
        }

        // ファイルアップロード
        public static async Task UploadAsync(MemoryStream fileStream, string fileName)
        {
            BlobClient blobClient = CreateBlobClient(fileName);
            BlobHttpHeaders blobHttpHeaders = new BlobHttpHeaders() {
                ContentType = GetContentType(fileName)
            };
            // !ATTENTION! 同名のファイルがあった場合、上書きする処理です。
            await blobClient.UploadAsync(fileStream, blobHttpHeaders);
        }

        // ファイルの拡張子を元にMIMEタイプを返す
        private static string GetContentType(string filename)
        {
            switch (Path.GetExtension(filename).ToLower())
            {
                // Text
                case ".txt":
                    return "text/plain";
                // Image
                case ".pdf":
                    return "application/pdf";
                case ".jpg":
                case ".jpeg":
                    return "image/jpeg";
                case ".png":
                    return "image/png";
                // Zip
                case ".zip":
                    return "application/zip";
                // Others
                default:
                    return "";
            }
        }

        // ファイル削除
        public static async Task DeleteAsync(string fileName)
        {
            BlobClient blobClient = CreateBlobClient(fileName);
            
            // ファイル名が一致するものがあるかどうかを確認
            Azure.Response<bool> isBlobExists = await blobClient.ExistsAsync();
            if (isBlobExists.Value)
            {
                // ファイルがある場合のみ削除を行う
                await blobClient.DeleteAsync();
            }
        }
    }

    // ダウンロードしたファイル情報を返すクラス
    public class FileInfo
    {
        // ファイルデータのバイト配列
        public byte[] content { get; set; }
        public string contentType { get; set; }
    }
}
```