使用 AWS SDK for .NET 上傳大型封存 - Amazon S3 Glacier

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

如果您要尋找封存儲存解決方案,建議您在 Amazon S3、S3 Glacier S3 Instant RetrievalS3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 中使用 S3 Glacier 儲存類別。若要進一步了解這些儲存選項,請參閱 Amazon S3 使用者指南 中的使用 S3 Glacier 儲存類別的 S3 Glacier 儲存類別和長期資料儲存Amazon S3 這些儲存類別使用 Amazon S3 API,適用於所有區域,並且可以在 Amazon S3 主控台中管理。它們提供 Storage Cost Analysis、Storage Lens、進階選用加密功能等功能。

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

使用 AWS SDK for .NET 上傳大型封存

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

  • 高階的 API 提供了一種可用來上傳任何大小的封存的方法。根據您要上傳的檔案,該方法可以透過單一操作上傳封存,或者使用 Amazon S3 Glacier (S3 Glacier) 中的分段上傳支援以部分形式上傳封存。

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

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

使用 AWS SDK for .NET 的高階 API 以部分形式上傳大型封存

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

使用 AWS SDK for .NET 的低階 API 以部分形式上傳大型封存

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

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

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

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

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

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

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

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

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

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

以下 C# 程式碼範例使用 AWS SDK for .NET 將封存上傳到文件庫 (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.goskope.com.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; } } }