Copia di un oggetto utilizzando il caricamento in più parti - Amazon Simple Storage Service

Copia di un oggetto utilizzando il caricamento in più parti

Il caricamento multiparte consente di copiare oggetti su un insieme di parti. Gli esempi in questa sezione mostrano come copiare oggetti con dimensioni superiori a 5 GB utilizzando l'API per il caricamento in più parti. Per informazioni sui caricamenti multiparte, consulta Caricamento e copia di oggetti utilizzando il caricamento multiparte in Amazon S3.

È possibile copiare oggetti inferiori a 5 GB in una singola operazione senza utilizzare l'API di caricamento multiparte. È possibile copiare oggetti di dimensioni inferiori a 5 GB utilizzando Console di gestione AWS, AWS CLI, la REST API o gli SDK AWS. Per ulteriori informazioni, consulta Copia, spostamento e denominazione di oggetti.

Per una procedura end-to-end che dimostra come caricare un oggetto utilizzando il caricamento multiparte con un checksum aggiuntivo, consulta Esercitazione: caricamento di un oggetto tramite caricamento multiparte per verificarne l'integrità dei dati.

La sezione seguente mostra come copiare un oggetto con un caricamento multiparte con la REST API o gli SDK AWS.

Le seguenti sezioni di Riferimento API di Amazon Simple Storage Service descrivono la REST API per il caricamento multiparte. Per copiare un oggetto esistente, utilizza l'API Upload Part (Copy) e specifica l'oggetto di origine aggiungendo l'intestazione x-amz-copy-source nella richiesta.

Si possono utilizzare queste API per effettuare richieste REST personalizzate oppure è possibile utilizzare uno degli SDK forniti da noi. Per ulteriori informazioni sull'utilizzo del caricamento in più parti con AWS CLI, consulta Utilizzo di AWS CLI. Per ulteriori informazioni sugli SDK, consulta AWSSupporto per l'SDK per il caricamento in più parti.

Per copiare un oggetto utilizzando l'API di basso livello, effettua le seguenti operazioni:

  • Avvia il caricamento in più parti chiamando il metodo AmazonS3Client.initiateMultipartUpload().

  • Salvare l'ID caricamento dall'oggetto della risposta restituito dal metodo AmazonS3Client.initiateMultipartUpload(). Si fornisce questo ID di caricamento per ciascuna operazione di caricamento di parte.

  • Copia tutte le parti. Per ciascuna parte che è necessario copiare, creare una nuova istanza della classe CopyPartRequest. Fornisci le informazioni sulla parte, inclusi i nomi bucket di origine e destinazione, le chiavi dell'oggetto di origine e destinazione, l'ID di caricamento, le posizioni dei primi e degli ultimi byte della parte e il numero della parte.

  • Salva le risposte che il metodo AmazonS3Client.copyPart() chiama. Ogni risposta include il valore ETag e il numero della parte per la parte caricata. Tali informazioni saranno necessarie per completare il caricamento in più parti.

  • Chiama il metodo AmazonS3Client.completeMultipartUpload() per completare l'operazione di copia.

Java

Per esempi su come copiare oggetti utilizzando il caricamento in più parti con AWS SDK per Java, consulta Copia di parte di un oggetto da un altro oggetto nella Guida di riferimento delle API di Amazon S3.

.NET

Il seguente esempio di codice C# mostra come utilizzare SDK per .NET per copiare un oggetto Amazon S3 con dimensioni superiori a 5 GB da una posizione di origine a un'altra, ad esempio da un bucket a un altro. Per copiare gli oggetti con dimensioni inferiori a 5 GB, utilizza la procedura di copia in una sola operazione come descritto in Uso degli AWS SDK. Per ulteriori informazioni sui caricamenti in più parti di Amazon S3, consulta Caricamento e copia di oggetti utilizzando il caricamento multiparte in Amazon S3.

Questo esempio mostra come copiare un oggetto Amazon S3 con dimensioni superiori a 5 GB da un bucket S3 a un altro utilizzando l'API SDK per .NET per il caricamento in più parti .

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