Carga de archivos grandes con AWS SDK for .NET - Amazon S3 Glacier

Esta página es solo para los clientes actuales del servicio S3 Glacier que utilizan Vaults y el original de 2012. REST API

Si busca soluciones de almacenamiento de archivos, le sugerimos que utilice las clases de almacenamiento S3 Glacier en Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval y S3 Glacier Deep Archive. Para obtener más información sobre estas opciones de almacenamiento, consulte Clases de almacenamiento de S3 Glacier y Almacenamiento de datos a largo plazo con clases de almacenamiento de S3 Glacier en la Guía del usuario de Amazon S3. Estas clases de almacenamiento utilizan Amazon S3API, están disponibles en todas las regiones y se pueden gestionar en la consola de Amazon S3. Ofrecen funciones como el análisis de costos de almacenamiento, Storage Lens, funciones avanzadas de cifrado opcionales y más.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Carga de archivos grandes con AWS SDK for .NET

Las API de alto y de bajo nivel que proporciona Amazon SDK para .NET ofrecen un método para cargar archivos de gran tamaño por partes (consulte Carga de un archivo en Amazon S3 Glacier).

  • La API de alto nivel cuenta con un método que le permite cargar archivos de cualquier tamaño. En función del archivo que se vaya a cargar, el método lo carga en una sola operación o usa la compatibilidad de Amazon S3 Glacier (S3 Glacier) con la carga multiparte para cargar el archivo por partes.

  • La API de bajo nivel se mapea estrechamente a la implementación de REST subyacente. Por lo tanto, proporciona un método para cargar archivos más pequeños en una operación y un grupo de métodos que admiten carga multiparte para archivos más grandes. En esta sección se explica cómo cargar archivos grandes por partes con la API de bajo nivel.

Para obtener más información sobre las API de alto y bajo nivel, consulte Uso de AWS SDK for .NET con Amazon S3 Glacier.

Carga de archivos grandes por partes con la API de alto nivel de AWS SDK for .NET

Utilice los mismos métodos de la API de alto nivel para cargar archivos pequeños o grandes. En función del tamaño de archivo, los métodos de la API de alto nivel deciden si se carga el archivo en una sola operación o se utiliza la API de carga multiparte que proporciona S3 Glacier. Para obtener más información, consulte Actualización de un archivo con la API de alto nivel de AWS SDK for .NET.

Carga de archivos grandes por partes con la API de bajo nivel de AWS SDK for .NET

Para tener un control más detallado de la carga, puede utilizar la API de bajo nivel, donde puede configurar la solicitud y procesar la respuesta. A continuación, se indican los pasos necesarios para cargar archivos grandes por partes con AWS SDK for .NET.

  1. Cree una instancia de la clase AmazonGlacierClient (el cliente).

    Debe especificar la región de AWS en la que quiere guardar el archivo. Todas las operaciones que realice con este cliente se aplican a esa región de AWS.

  2. Inicie una carga multiparte llamando al método InitiateMultipartUpload.

    Tiene que proporcionar el nombre del almacén en el que quiere cargar el archivo, el tamaño de cada parte y una descripción opcional. Puede facilitar esta información creando una instancia de la clase InitiateMultipartUploadRequest. En respuesta, S3 Glacier devuelve un ID de carga.

  3. Cargue las partes llamando al método UploadMultipartPart.

    Por cada parte que cargue, debe indicar el nombre de almacén, el rango de bytes en el archivo montado final que se cargarán en esta parte, la suma de comprobación de los datos de parte y el ID de carga.

  4. Complete la carga multiparte llamando al método CompleteMultipartUpload.

    Debe proporcionar el ID de carga, la suma de comprobación de todo el archivo, el tamaño de archivo (tamaño combinado de todas las partes que ha cargado) y el nombre de almacén. S3 Glacier construye el archivo a partir de las partes cargadas y devuelve un ID de archivo.

Ejemplo: Cargar un archivo grande por partes con Amazon SDK para .NET

En el siguiente ejemplo de código C# utiliza AWS SDK for .NET para cargar un archivo en un almacén (examplevault). Para obtener instrucciones paso a paso sobre cómo ejecutar este ejemplo, consulte Ejecución de los ejemplos de código. Debe actualizar el código mostrado con el nombre del archivo que quiera cargar.

using System; using System.Collections.Generic; using System.IO; using Amazon.Glacier; using Amazon.Glacier.Model; using Amazon.Runtime; namespace glacier.amazon.com.rproxy.goskope.com.docsamples { class ArchiveUploadMPU { static string vaultName = "examplevault"; static string archiveToUpload = "*** Provide file name (with full path) to upload ***"; static long partSize = 4194304; // 4 MB. public static void Main(string[] args) { AmazonGlacierClient client; List<string> partChecksumList = new List<string>(); try { using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2)) { Console.WriteLine("Uploading an archive."); string uploadId = InitiateMultipartUpload(client); partChecksumList = UploadParts(uploadId, client); string archiveId = CompleteMPU(uploadId, client, partChecksumList); Console.WriteLine("Archive ID: {0}", archiveId); } Console.WriteLine("Operations successful. To continue, press Enter"); Console.ReadKey(); } catch (AmazonGlacierException e) { Console.WriteLine(e.Message); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("To continue, press Enter"); Console.ReadKey(); } static string InitiateMultipartUpload(AmazonGlacierClient client) { InitiateMultipartUploadRequest initiateMPUrequest = new InitiateMultipartUploadRequest() { VaultName = vaultName, PartSize = partSize, ArchiveDescription = "Test doc uploaded using MPU." }; InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest); return initiateMPUresponse.UploadId; } static List<string> UploadParts(string uploadID, AmazonGlacierClient client) { List<string> partChecksumList = new List<string>(); long currentPosition = 0; var buffer = new byte[Convert.ToInt32(partSize)]; long fileLength = new FileInfo(archiveToUpload).Length; using (FileStream fileToUpload = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read)) { while (fileToUpload.Position < fileLength) { Stream uploadPartStream = GlacierUtils.CreatePartStream(fileToUpload, partSize); string checksum = TreeHashGenerator.CalculateTreeHash(uploadPartStream); partChecksumList.Add(checksum); // Upload part. UploadMultipartPartRequest uploadMPUrequest = new UploadMultipartPartRequest() { VaultName = vaultName, Body = uploadPartStream, Checksum = checksum, UploadId = uploadID }; uploadMPUrequest.SetRange(currentPosition, currentPosition + uploadPartStream.Length - 1); client.UploadMultipartPart(uploadMPUrequest); currentPosition = currentPosition + uploadPartStream.Length; } } return partChecksumList; } static string CompleteMPU(string uploadID, AmazonGlacierClient client, List<string> partChecksumList) { long fileLength = new FileInfo(archiveToUpload).Length; CompleteMultipartUploadRequest completeMPUrequest = new CompleteMultipartUploadRequest() { UploadId = uploadID, ArchiveSize = fileLength.ToString(), Checksum = TreeHashGenerator.CalculateTreeHash(partChecksumList), VaultName = vaultName }; CompleteMultipartUploadResponse completeMPUresponse = client.CompleteMultipartUpload(completeMPUrequest); return completeMPUresponse.ArchiveId; } } }