Copiar um objeto usando multipart upload
O carregamento fracionado permite copiar objetos como um conjunto de partes. Os exemplos nesta seção mostram como copiar objetos maiores que 5 GB usando a API de multipart upload. Consulte informações sobre carregamentos fracionados em Carregar e copiar objetos usando upload fracionado no Amazon S3.
É possível copiar objetos com menos de 5 GB em uma única operação sem usar a API de carregamento fracionado. É possível copiar objetos com menos de 5 GB usando o AWS Management Console, a AWS CLI, a API REST ou SDKs da AWS. Para ter mais informações, consulte Copiar, mover e renomear objetos.
Consulte um procedimento completo sobre o upload de um objeto com carregamento fracionado e com uma soma de verificação adicional em Tutorial: Fazer upload de um objeto por meio do carregamento fracionado e conferir a integridade dos dados.
A seção a seguir mostra como copiar um objeto com carregamento fracionado usando a API REST ou SDKs da AWS.
As seções a seguir na Referência de APIs do Amazon Simple Storage Service descrevem a API REST para multipart upload. Para copiar um objeto existente, use a API para upload de parte (cópia) e especifique o objeto de origem adicionando o cabeçalho de solicitação x-amz-copy-source
na solicitação.
Use essas APIs para fazer suas próprias solicitações REST ou use um dos SDKs que fornecemos. Para obter mais informações sobre como usar o multipart upload com a AWS CLI, consulte Como usar a AWS CLI. Para obter mais informações sobre os SDKs, consulte Suporte do AWS SDK para upload fracionado.
Para copiar um objeto usando a API de baixo nível, faça o seguinte:
-
Inicie um multipart upload chamando o método AmazonS3Client.initiateMultipartUpload()
.
-
Salve o ID de upload do objeto de resposta retornado pelo método AmazonS3Client.initiateMultipartUpload()
. Você fornece esse ID de upload para cada operação do upload de parte.
-
Copie todas as partes. Para cada parte que você precisar copiar, crie uma nova instância da classe CopyPartRequest
. Forneça as informações da parte, incluindo a origem e os nomes do bucket de destino, as chaves de objeto de origem e de destino, o ID de upload, os locais dos primeiros e últimos bytes da parte, e o número da parte.
-
Salve as respostas das chamadas de método AmazonS3Client.copyPart()
. Cada resposta inclui o valor ETag
e o número da parte para a parte cujo upload foi feito. Você precisa dessas informações para concluir o multipart upload.
-
Chame o método AmazonS3Client.completeMultipartUpload()
para concluir a operação de cópia.
- Java
-
Para obter exemplos de como copiar objetos usando o multipart upload com o AWS SDK para Java, consulte Copy part of an object from another object na Referência de API do Amazon S3.
- .NET
-
O exemplo em C# a seguir mostra como usar o SDK para .NET para copiar um objeto do Amazon S3 com mais de 5 GB de um local de origem para outro, como de um bucket para outro. Para copiar objetos menores que 5 GB, use um procedimento de cópia de operação única descrita em Usar SDKs da AWS. Para obter mais informações sobre multipart uploads do Amazon S3, consulte Carregar e copiar objetos usando upload fracionado no Amazon S3.
Este exemplo mostra como copiar um objeto do Amazon S3 com mais de 5 GB de um bucket do S3 para outro usando a API de carregamento fracionado do SDK para .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);
}
}
}
}