使用 上傳大型封存 適用於 .NET 的 AWS SDK - Amazon Glacier

此頁面僅適用於使用 Vaults 和 2012 年原始 REST API 的 Amazon Glacier 服務的現有客戶。

如果您要尋找封存儲存解決方案,建議您在 Amazon Glacier Instant Retrieval、S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 中使用 Amazon Glacier 儲存類別。 Amazon S3 若要進一步了解這些儲存選項,請參閱 Amazon Glacier 儲存類別

自 2025 年 12 月 15 日起,Amazon Glacier (原始獨立保存庫型服務) 將不再接受新客戶,不會影響現有客戶。Amazon Glacier 是一項獨立服務,具有自己的 APIs,可將資料存放在保存庫中,並與 Amazon S3 和 Amazon S3 Glacier 儲存類別不同。您現有的資料將在 Amazon Glacier 中無限期保持安全且可存取。不需要遷移。對於低成本、長期的封存儲存, AWS 建議採用 Amazon S3 Glacier 儲存類別,透過 S3 儲存貯體型 APIs、完整 AWS 區域 可用性、降低成本 AWS 和服務整合,提供卓越的客戶體驗。如果您想要增強功能,請考慮使用我們的解決方案指南,將資料從 Amazon S3 Glacier 保存庫傳輸至 Amazon S3 Glacier 儲存類別,以遷移至 Amazon S3 Glacier 儲存類別。 AWS Amazon Glacier Amazon S3

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 上傳大型封存 適用於 .NET 的 AWS SDK

適用於 .NET 的 Amazon 開發套件提供的高階和低階 API 都提供了以部分形式上傳大型封存的方法 (請參閱在 Amazon Glacier 中上傳封存)。

  • 高階的 API 提供了一種可用來上傳任何大小的封存的方法。根據您上傳的檔案, 方法會在單一操作中上傳封存,或使用 Amazon Glacier (Amazon Glacier) 中的分段上傳支援來分段上傳封存。

  • 低階 API 對應接近底層 REST 實作。因此,它提供一個方法,在一個操作中上傳較小的封存,以及一組方法,可支援分段上傳以上傳較大封存。本節說明使用低階 API 以部分形式上傳大型封存。

如需高階和低階的 API 的更多資訊,請參閱 適用於 .NET 的 AWS SDK 搭配 Amazon Glacier 使用

使用 的高階 API 分段上傳大型封存 適用於 .NET 的 AWS SDK

您可以使用高階 API 的相同方法來上傳小型或大型封存。根據封存大小,高階 API 方法會決定在單一操作中上傳封存,還是使用 Amazon Glacier 提供的分段上傳 API。如需詳細資訊,請參閱使用 的高階 API 上傳封存 適用於 .NET 的 AWS SDK

使用 的低階 API 分段上傳大型封存 適用於 .NET 的 AWS SDK

對於精細控制上傳,您可以使用低階 API,您可以設定請求和處理回應。以下是使用 適用於 .NET 的 AWS SDK以部分形式上傳大型封存的步驟。

  1. 建立 AmazonGlacierClient 類別的執行個體 (用戶端)。

    您需要指定要儲存封存 AWS 的區域。您使用此用戶端執行的所有操作都會套用到該 AWS 區域。

  2. 呼叫 InitiateMultipartUpload 方法以啟動分段上傳。

    您需要提供要上傳封存的保存庫名稱、要用於上傳封存部分的部分大小以及可選說明。您可以透過建立 InitiateMultipartUploadRequest 類別的執行個體,來提供這項資訊。在回應中,Amazon Glacier 會傳回上傳 ID。

  3. 透過呼叫 UploadMultipartPart 方法上傳部分。

    對於您上載的每個部分,您需要提供文件庫名稱、在該部分中上傳的最終組合的存檔中的位元組範圍、部分資料的檢查總和和上傳 ID。

  4. 呼叫 CompleteMultipartUpload 方法以計算分段上傳。

    您需要提供上傳 ID、整個封存的檢查總和、封存大小 (您上傳的所有部分的組合大小) 和保存庫名稱。Amazon Glacier 會從上傳的組件建構封存,並傳回封存 ID。

範例:使用適用於 .NET 的 Amazon 開發套件,以部分形式上傳大型封存

下列 C# 程式碼範例使用 適用於 .NET 的 AWS SDK 將封存上傳至保存庫 (examplevault)。如需執行此範例的逐步說明,請參閱 執行程式碼範例。您必須如所示,使用要上傳的檔案名稱更新程式碼。

using System; using System.Collections.Generic; using System.IO; using Amazon.Glacier; using Amazon.Glacier.Model; using Amazon.Runtime; namespace glacier.amazon.com.rproxy.govskope.ca.docsamples { class ArchiveUploadMPU { static string vaultName = "examplevault"; static string archiveToUpload = "*** Provide file name (with full path) to upload ***"; static long partSize = 4194304; // 4 MB. public static void Main(string[] args) { AmazonGlacierClient client; List<string> partChecksumList = new List<string>(); try { using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2)) { Console.WriteLine("Uploading an archive."); string uploadId = InitiateMultipartUpload(client); partChecksumList = UploadParts(uploadId, client); string archiveId = CompleteMPU(uploadId, client, partChecksumList); Console.WriteLine("Archive ID: {0}", archiveId); } Console.WriteLine("Operations successful. To continue, press Enter"); Console.ReadKey(); } catch (AmazonGlacierException e) { Console.WriteLine(e.Message); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("To continue, press Enter"); Console.ReadKey(); } static string InitiateMultipartUpload(AmazonGlacierClient client) { InitiateMultipartUploadRequest initiateMPUrequest = new InitiateMultipartUploadRequest() { VaultName = vaultName, PartSize = partSize, ArchiveDescription = "Test doc uploaded using MPU." }; InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest); return initiateMPUresponse.UploadId; } static List<string> UploadParts(string uploadID, AmazonGlacierClient client) { List<string> partChecksumList = new List<string>(); long currentPosition = 0; var buffer = new byte[Convert.ToInt32(partSize)]; long fileLength = new FileInfo(archiveToUpload).Length; using (FileStream fileToUpload = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read)) { while (fileToUpload.Position < fileLength) { Stream uploadPartStream = GlacierUtils.CreatePartStream(fileToUpload, partSize); string checksum = TreeHashGenerator.CalculateTreeHash(uploadPartStream); partChecksumList.Add(checksum); // Upload part. UploadMultipartPartRequest uploadMPUrequest = new UploadMultipartPartRequest() { VaultName = vaultName, Body = uploadPartStream, Checksum = checksum, UploadId = uploadID }; uploadMPUrequest.SetRange(currentPosition, currentPosition + uploadPartStream.Length - 1); client.UploadMultipartPart(uploadMPUrequest); currentPosition = currentPosition + uploadPartStream.Length; } } return partChecksumList; } static string CompleteMPU(string uploadID, AmazonGlacierClient client, List<string> partChecksumList) { long fileLength = new FileInfo(archiveToUpload).Length; CompleteMultipartUploadRequest completeMPUrequest = new CompleteMultipartUploadRequest() { UploadId = uploadID, ArchiveSize = fileLength.ToString(), Checksum = TreeHashGenerator.CalculateTreeHash(partChecksumList), VaultName = vaultName }; CompleteMultipartUploadResponse completeMPUresponse = client.CompleteMultipartUpload(completeMPUrequest); return completeMPUresponse.ArchiveId; } } }