前篇文章介紹了如何把資料傳至 Azure Table,本篇文章會講解如何上傳檔案。

下列程式要注意的是 BlobContainerClient 的用法,其實不難,呼叫 UploadBlobAsync 這個 method 就可以了,而取得所有檔案透過 PartitionKey 即可,如果是特定檔案的話,要有 RowKey。

private void Init()
{
    TableServiceClient tableServiceClient = new TableServiceClient(TableConnectionString);
    TableClient tableClient = tableServiceClient.GetTableClient(tableName: _tableName);

    tableClient.CreateIfNotExistsAsync().Wait();
    _cosmosClient = tableClient;

    _blobContainerClient = new BlobContainerClient(BlobConnectionString, ContainerName);
    _blobContainerClient.CreateIfNotExists();
}

public async Task AddPicData(PictureData pictureData, Stream stream)
{
    var response = await _blobContainerClient.UploadBlobAsync(pictureData.FileName, stream);
    await _cosmosClient.AddEntityAsync<PictureData>(pictureData);
}

public async Task<List<PictureData>> GetPictureDataList()
{
    List<PictureData> list = _cosmosClient.Query<PictureData>(p => p.PartitionKey == PartitionKey).ToList();

    return list;
}

下列程式碼是 Blazor 的前端部份,單純上傳檔案。

@page "/UploadPic"
@using AIPicturesAlbumWebAP.Data
@inject IPictureAppService pictureAppService

<h3>UploadPic</h3>
<Toasts class="p-3" Messages="messages" AutoHide="true" Delay=2000 Placement="ToastsPlacement.TopCenter" />

<InputFile OnChange="@LoadFiles" multiple />

@code {
    List<ToastMessage> messages = new List<ToastMessage>();
    private IBrowserFile browserFile;
    private async void LoadFiles(InputFileChangeEventArgs e)
    {
        browserFile = e.File;
        var stream = browserFile.OpenReadStream(maxAllowedSize: 512000000);
        PictureData pictureData = new PictureData
        {
            Desc = string.Empty,
            FileName = browserFile.Name,
            ImageUrl = PictureRepository.CDNDomain + browserFile.Name,
            Title = string.Empty
        };
        await pictureAppService.AddPicData(pictureData, stream);
        Task.WaitAll();
        messages.Add(CreateToastMessage(ToastType.Info));
    }

    private ToastMessage CreateToastMessage(ToastType toastType)
    => new ToastMessage
    {
        Type = toastType,
        Message = $"File Uploaded. DateTime: {DateTime.Now}",
    };
}

參考資料