Amazon Glacier
开发人员指南 (API 版本 2012-06-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用适用于 .NET 的 AWS 开发工具包上传大型档案

适用于 .NET 的 AWS 开发工具包所提供的高级 API 和低级 API 各提供了一个方法来分段上传大型档案(请参阅“在 Amazon Glacier 中上传档案”)。

  • 该高级 API 提供了您可以用来上传任何大小的档案的方法。根据您要上传的文件,该方法会在单一操作中上传档案或者使用 Amazon Glacier 中的分段上传支持来分段上传档案。

  • 该低级 API 紧密映射到底层 REST 实施。因此,它提供了一个在单一操作中上传较小档案的方法,以及一组支持较大档案的分段上传的方法。此部分说明了使用低级 API 分段上传大型档案的操作。

有关高级和低级 API 的更多信息,请参阅“在 Amazon Glacier 中使用适用于 .NET 的 AWS 开发工具包”。

使用适用于 .NET 的 AWS 开发工具包的高级 API 分段上传大型档案

您可以使用高级 API 的相同方法上传小型或大型档案。根据档案大小,高级 API 方法会决定是在单个操作中上传档案,还是使用 Amazon Glacier 提供的分段上传 API 上传档案。有关更多信息,请参阅 使用适用于 .NET 的 AWS 开发工具包高级 API 上传档案

使用适用于 .NET 的 AWS 开发工具包的低级 API 分段上传大型档案

对于上传的粒度控制,您可以使用低级 API(您可以在其中配置请求以及处理响应)。以下是使用适用于 .NET 的 AWS 开发工具包分段上传大型档案的步骤。

  1. 创建 AmazonGlacierClient 类(客户端)的实例。

    您需要指定您要在其中保存档案的 AWS 区域。您使用此客户端执行的所有操作都会应用到该区域。

  2. 通过调用 InitiateMultipartUpload 方法启动分段上传。

    您需要提供要上传档案的文件库名称、要上传的档案段的大小,也可选择提供相关描述。您可以通过创建 InitiateMultipartUploadRequest 类的实例提供此信息。作为响应,Amazon Glacier 会返回上传 ID。

  3. 通过调用 UploadMultipartPart 方法上传段。

    对于要上传的每一段,您需要提供文件库名称、将在此段中上传的最终组合档案的字节范围、段数据的校验和,以及上传 ID。

  4. 通过调用 CompleteMultipartUpload 方法完成分段上传。

    您需要提供上传 ID、整个档案的校验和、档案大小(您上传的所有段的综合大小),以及文件库名称。Amazon Glacier 会使用上传的段拼组档案并返回档案 ID。

示例:使用适用于 .NET 的 AWS 开发工具包分段上传大型档案

以下 C# 代码示例使用适用于 .NET 的 AWS 开发工具包将档案上传到文件库 (examplevault)。有关如何运行以下示例的分步说明,请参阅运行代码示例。您需要更新待上传文件名称旁显示的代码。

using System; using System.Collections.Generic; using System.IO; using Amazon.Glacier; using Amazon.Glacier.Model; using Amazon.Runtime; namespace glacier.amazon.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; } } }