問題描述
在使用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