此页面仅适用于使用文件库和 2012 年原始 REST API 的 S3 Glacier 服务的现有客户。
如果您正在寻找归档存储解决方案,建议使用 Amazon S3 中的 S3 Glacier 存储类 S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive。要了解有关这些存储选项的更多信息,请参阅《Amazon S3 用户指南》中的 S3 Glacier 存储类
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用上传大型档案 适用于 .NET 的 Amazon SDK
适用于.NET 的 Amazon SDK APIs 提供的高级和低级都提供了一种分段上传大型档案的方法(参见在 Amazon S3 Glacier 中上传档案)。
-
该高级 API 提供了您可以用来上传任何大小的档案的方法。根据您要上传的文件,该方法会在单一操作中上传档案或者使用 Amazon S3 Glacier(S3 Glacier)中的分段上传支持来分段上传档案。
-
该低级 API 紧密映射到底层 REST 实施。因此,它提供了一个在单一操作中上传较小档案的方法,以及一组支持较大档案的分段上传的方法。此部分说明了使用低级 API 分段上传大型档案的操作。
有关高级和低级别的更多信息 APIs,请参阅适用于 .NET 的 Amazon SDK 与 Amazon S3 Glacier 搭配使用。
使用的高级别 API 分段上传大型档案 适用于 .NET 的 Amazon SDK
您可以使用高级 API 的相同方法上传小型或大型档案。根据档案大小,高级 API 方法会决定是在单个操作中上传档案,还是使用 S3 Glacier 提供的分段上传 API 上传档案。有关更多信息,请参阅 使用的高级别 API 上传档案 适用于 .NET 的 Amazon SDK。
使用的低级 API 分段上传大型档案 适用于 .NET 的 Amazon SDK
对于上传的粒度控制,您可以使用低级 API(您可以在其中配置请求以及处理响应)。以下是使用 适用于 .NET 的 Amazon SDK分段上传大型档案的步骤。
-
创建
AmazonGlacierClient
类(客户端)的实例。您需要指定要保存档案的 Amazon 区域。您使用此客户端执行的所有操作都适用于该 Amazon 区域。
-
通过调用
InitiateMultipartUpload
方法启动分段上传。您需要提供要上传档案的文件库名称、要上传的档案段的大小,也可选择提供相关描述。您可以通过创建
InitiateMultipartUploadRequest
类的实例提供此信息。作为响应,S3 Glacier 会返回上传 ID。 -
通过调用
UploadMultipartPart
方法上传段。对于要上传的每一段,您需要提供文件库名称、将在此段中上传的最终组合档案的字节范围、段数据的校验和,以及上传 ID。
-
通过调用
CompleteMultipartUpload
方法完成分段上传。您需要提供上传 ID、整个档案的校验和、档案大小(您上传的所有段的组合大小)和文件库名称。S3 Glacier 从上传的分段构造档案并返回档案 ID。
示例:使用适用于 .NET 的 Amazon SDK 分段上传大型档案
以下 C# 代码示例使用将档案上传 适用于 .NET 的 Amazon SDK 到文件库 (examplevault
)。有关如何运行此示例的 step-by-step说明,请参阅运行代码示例。您需要更新待上传文件名称旁显示的代码。
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; } } }