View a markdown version of this page

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

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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. Puoi copiare oggetti di dimensioni inferiori a 5 GB utilizzando l'API REST o Console di gestione AWS gli AWS CLI 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 caricamento multiparte con l'API REST o AWS gli SDK.

Le sezioni seguenti della Documentazione di riferimento delle API di Amazon Simple Storage Service descrivono REST API per il caricamento in più parti. 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 di Multipart Upload con, consulta AWS CLI. Utilizzo di AWS CLI Per ulteriori informazioni sugli SDK, consulta AWS Supporto 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 l' AWS SDK for Java, consulta Copiare parte di un oggetto da un altro oggetto nel riferimento alle API di Amazon S3.

.NET

Il seguente esempio in C# mostra come utilizzare SDK per .NET per copiare un oggetto Amazon S3 di dimensioni superiori a 5 GB da una posizione di origine a un'altra, ad esempio da un bucket all'altro. Per copiare gli oggetti con dimensioni inferiori a 5 GB, utilizza la procedura di copia in una sola operazione come descritto in Utilizzo di 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 di dimensioni superiori a 5 GB da un bucket S3 a un altro utilizzando l' SDK per .NET API di caricamento multipart.

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