Copie d’un objet à l’aide du chargement partitionné - Amazon Simple Storage Service

Copie d’un objet à l’aide du chargement partitionné

Le chargement partitionné vous permet de copier des objets en plusieurs parties. Les exemples de cette section vous montrent comment copier des objets supérieurs à 5 Go grâce à l’API de chargement partitionné. Pour plus d’informations sur les chargements partitionnés, consultez Chargement et copie d’objets à l’aide du chargement partitionné dans Amazon S3.

Vous pouvez copier les objets inférieurs à 5 Go en une seule opération sans avoir à utiliser l’API de chargement partitionné. Vous pouvez copier des objets inférieurs à 5 Go en une seule opération à l’aide de la AWS Management Console, de l’AWS CLI, l’API REST ou des kits AWS SDK. Pour plus d’informations, consultez Copie, déplacement et changement de nom des objets.

Pour obtenir une procédure complète sur le chargement partitionné d’un objet avec une somme de contrôle supplémentaire, consultez Didacticiel : chargement partitionné d’un objet et vérification de l’intégrité de ses données.

La section suivante explique comment copier un objet avec le chargement partitionné à l’aide de l’API REST ou des kits AWS SDK.

Les sections suivantes de la Référence de l’API Amazon Simple Storage Service décrivent l’API REST pour le chargement partitionné. Pour copier un objet existant, utilisez l’API de chargement d’une partie (Copy) et spécifiez l’objet source en ajoutant l’en-tête x-amz-copy-source dans votre demande.

Vous pouvez utiliser ces API pour vos propres demandes REST ou vous pouvez utiliser l’un des kits SDK fournis. Pour plus d’informations sur l’utilisation du chargement partitionné avec AWS CLI, consultez Utilisation de la AWS CLI. Pour plus d’informations sur les kits SDK, consultez Prise en charge des kits AWS SDK pour le chargement partitionné.

Pour copier un objet à l’aide de l’API de bas niveau, procédez comme suit :

  • Lancez un chargement partitionné en appelant la méthode AmazonS3Client.initiateMultipartUpload().

  • Enregistrez l’ID de chargement de l’objet de la réponse renvoyé par la méthode AmazonS3Client.initiateMultipartUpload(). Vous devez fournir cet ID de chargement pour chaque opération de chargement de partie.

  • Copiez toutes les parties. Pour chaque partie que vous devez copier, créez une nouvelle instance de la classe CopyPartRequest. Fournissez les informations sur la partie, notamment les noms des compartiments source et de destination, les clés d’objet source et de destination, l’ID de chargement, les emplacement des premier et dernier octets de la partie, ainsi que le numéro de la partie.

  • Enregistrez les réponses des appels de méthode AmazonS3Client.copyPart(). Chaque réponse inclut la valeur ETag et le numéro de partie de la partie chargée. Vous avez besoin de ces informations pour terminer le chargement partitionné.

  • Appelez la méthode AmazonS3Client.completeMultipartUpload() pour terminer l’opération de copie.

Java

Pour voir des exemples de copie d’objets à l’aide d’un chargement partitionné avec le kit AWS SDK pour Java, consultez Copie d’une partie d’un autre objet dans la Référence des API Amazon S3.

.NET

L’exemple C# suivant montre comment utiliser le kit SDK pour .NET pour copier un objet Amazon S3 dont la taille est supérieure à 5 Go d’un emplacement source vers un autre, par exemple, d’un compartiment vers un autre. Pour copier des objets dont la taille est inférieure à 5 Go, utilisez la procédure de copie en une seule opération décrite dans Utilisation des kits AWS SDK. Pour en savoir plus sur les chargements partitionnés Amazon S3, veuillez consulter Chargement et copie d’objets à l’aide du chargement partitionné dans Amazon S3.

Cet exemple montre comment copier un objet Amazon S3 dont la taille est supérieure à 5 Go d’un compartiment S3 vers un autre à l’aide de l’API de chargement partitionné du kit SDK pour .NET.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CopyObjectUsingMPUapiTest { private const string sourceBucket = "*** provide the name of the bucket with source object ***"; private const string targetBucket = "*** provide the name of the bucket to copy the object to ***"; private const string sourceObjectKey = "*** provide the name of object to copy ***"; private const string targetObjectKey = "*** provide the name of the object copy ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); Console.WriteLine("Copying an object"); MPUCopyObjectAsync().Wait(); } private static async Task MPUCopyObjectAsync() { // Create a list to store the upload part responses. List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>(); List<CopyPartResponse> copyResponses = new List<CopyPartResponse>(); // Setup information required to initiate the multipart upload. InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest { BucketName = targetBucket, Key = targetObjectKey }; // Initiate the upload. InitiateMultipartUploadResponse initResponse = await s3Client.InitiateMultipartUploadAsync(initiateRequest); // Save the upload ID. String uploadId = initResponse.UploadId; try { // Get the size of the object. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest { BucketName = sourceBucket, Key = sourceObjectKey }; GetObjectMetadataResponse metadataResponse = await s3Client.GetObjectMetadataAsync(metadataRequest); long objectSize = metadataResponse.ContentLength; // Length in bytes. // Copy the parts. long partSize = 5 * (long)Math.Pow(2, 20); // Part size is 5 MB. long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) { CopyPartRequest copyRequest = new CopyPartRequest { DestinationBucket = targetBucket, DestinationKey = targetObjectKey, SourceBucket = sourceBucket, SourceKey = sourceObjectKey, UploadId = uploadId, FirstByte = bytePosition, LastByte = bytePosition + partSize - 1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1, PartNumber = i }; copyResponses.Add(await s3Client.CopyPartAsync(copyRequest)); bytePosition += partSize; } // Set up to complete the copy. CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest { BucketName = targetBucket, Key = targetObjectKey, UploadId = initResponse.UploadId }; completeRequest.AddPartETags(copyResponses); // Complete the copy. CompleteMultipartUploadResponse completeUploadResponse = await s3Client.CompleteMultipartUploadAsync(completeRequest); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } } }