

# Copiar um objeto usando multipart upload
<a name="CopyingObjectsMPUapi"></a>

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](mpuoverview.md).

É 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 Console de gerenciamento da AWS, a AWS CLI, a API REST ou SDKs da AWS. Para obter mais informações, consulte [Copiar, mover e renomear objetos](copy-object.md). 

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](tutorial-s3-mpu-additional-checksums.md).

A seção a seguir mostra como copiar um objeto com carregamento fracionado usando a API REST ou SDKs da AWS.

## Uso da API REST
<a name="CopyingObjctsUsingRESTMPUapi"></a>

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. 
+ [Iniciar multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Carregar parte](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Carregar parte (copiar)](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)
+ [Concluir multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Anular carregamento fracionado](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html)
+ [Listar partes](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html)
+ [Listar carregamentos fracionados](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html)

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 [Usar a AWS CLI](mpu-upload-object.md#UsingCLImpUpload). Para obter mais informações sobre o recurso SDKs, consulte [AWSSuporte do SDK para upload fracionado](mpuoverview.md#sdksupportformpu).

## Uso da SDKs AWS
<a name="copy-object-mpu-sdks"></a>

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](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_UploadPartCopy_section.html) na *Referência de API do Amazon S3*.

------
#### [ .NET ]

O exemplo em C\$1 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](copy-object.md#CopyingObjectsUsingSDKs). Para obter mais informações sobre multipart uploads do Amazon S3, consulte [Carregar e copiar objetos usando upload fracionado no Amazon S3](mpuoverview.md).

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);
            }
        }
    }
}
```

------