【Azure 儲存服務】.NET7.0 範例程式碼之上傳大檔案到Azure Storage Blob

2023-01-19 18:01:02

問題描述

在使用Azure的儲存服務時候,如果上傳的檔案大於了100MB, 1GB的情況下,如何上傳呢?

 

問題解答

使用Azure儲存服務時,如果要上傳檔案到Azure Blob,有很多種工具可以實現。如:Azure 門戶, Azure Storage Explorer, 命令列工具 az copy等。

如果使用SDK,通過自定義程式碼上傳的時,需要主要大檔案上傳時候需要考慮的問題。 Azure Blob支援兩種上傳方式:整體上傳和分塊上傳

  • 整塊上傳:當上傳到塊 Blob 的檔案小於等於 SingleBlobUploadThresholdInBytes 屬性(使用者端可以通過設定該屬性設定單個 Blob 上傳的最大值,範圍介於 1MB 和 256MB 之間)的值時,則可以採用整體上傳的方式。

  • 分塊上傳:當上傳的塊 Blob 的檔案大於 SingleBlobUploadThresholdInBytes 屬性的值時,儲存使用者端會根據 StreamWriteSizeInBytes (使用者端可以通過設定該屬性設定單個分塊 Blob 的大小,範圍介於 16KB 和 100MB 之間) 的值將檔案分解成塊, 採用分塊上傳的方式上傳檔案。

 

如下範例,就是使用.NET7.0建立的範例程式碼:

1) 在VS Code中,使用 dotnet new console 建立一個空的控制檯專案

dotnet new console --framework net7.0

2)新增 Microsoft.WindowsAzure.Storage 參照

dotnet add package WindowsAzure.Storage --version 9.3.3

4)修改 Program.cs 程式碼

// See https://aka.ms/new-console-template for more information
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.RetryPolicies;

Console.WriteLine("Hello, World!");


TimeSpan backOffPeriod = TimeSpan.FromSeconds(2);
int retryCount = 1;
//設定請求選項
BlobRequestOptions requestoptions = new BlobRequestOptions()
{
    SingleBlobUploadThresholdInBytes = 1024 * 1024 * 10, //10MB
    ParallelOperationThreadCount = 12,
    RetryPolicy = new ExponentialRetry(backOffPeriod, retryCount),
};

//String storageConnectionString = System.Environment.GetEnvironmentVariable("StorageConnectionString", EnvironmentVariableTarget.User);
//Console.WriteLine("String account string : "+storageConnectionString);
String storageConnectionString ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobclient = account.CreateCloudBlobClient();
//設定使用者端預設請求選項
blobclient.DefaultRequestOptions = requestoptions;
CloudBlobContainer blobcontainer = blobclient.GetContainerReference("uploadfiles-123");


await blobcontainer.CreateIfNotExistsAsync();
//檔案路徑,檔案大小 117MB
string sourcePath = @"C:\WorkSpace\ETW\1.20211017.060119_000001.etl";
CloudBlockBlob blockblob = blobcontainer.GetBlockBlobReference("bigfiles");
//設定單個塊 Blob 的大小(分塊方式)
blockblob.StreamWriteSizeInBytes = 1024 * 1024 * 5;
try
{
    Console.WriteLine("uploading");
    //使用 Stopwatch 檢視上傳時間
    var timer = System.Diagnostics.Stopwatch.StartNew();
    using (var filestream = System.IO.File.OpenRead(sourcePath))
    {
        await blockblob.UploadFromStreamAsync(filestream);
    }
    timer.Stop();

    Console.WriteLine(timer.ElapsedMilliseconds);

    Console.WriteLine("Upload Successful, Time:" + timer.ElapsedMilliseconds);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

5) 程式碼完成。如果在Azure儲存賬號中開啟了診斷紀錄檔,當上傳大檔案後,就可以通過紀錄檔分析出,以上程式碼執行了多次Upload操作以完成大檔案的上傳!

 

 

參考資料

上傳大檔案到 Azure 儲存塊 Blob:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/storage/aog-storage-blob-howto-upload-big-file-to-storage

Tutorial: Create a .NET console application using Visual Studio Code : https://learn.microsoft.com/en-us/dotnet/core/tutorials/with-visual-studio-code?pivots=dotnet-7-0