

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

Si busca soluciones de almacenamiento de archivos, se recomienda que utilice las clases de almacenamiento de Amazon 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 las [clases de almacenamiento de Amazon Glacier](https://aws.amazon.com/s3/storage-classes/glacier/).

Amazon Glacier (servicio original independiente basado en bóveda) ya no acepta nuevos clientes. Amazon Glacier es un servicio independiente propio APIs que almacena datos en almacenes y es distinto de las clases de almacenamiento Amazon S3 y Amazon S3 Glacier. Sus datos actuales permanecerán seguros y accesibles en Amazon Glacier de forma indefinida. No hay que hacer migraciones. Para un almacenamiento de archivos a largo plazo y de bajo costo, AWS recomienda las [clases de almacenamiento Amazon S3 Glacier](https://aws.amazon.com/s3/storage-classes/glacier/), que ofrecen una experiencia de cliente superior con S3 basada en cubos APIs, Región de AWS disponibilidad total, costos más bajos e AWS integración de servicios. Si desea mejorar las capacidades, considere la posibilidad de migrar a las clases de almacenamiento de Amazon S3 Glacier mediante nuestra [AWS Guía de soluciones para la transferencia de datos de los almacenes de Amazon Glacier a las clases de almacenamiento de Amazon S3 Glacier](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/).

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 por partes (carga multiparte)
<a name="uploading-archive-mpu"></a>

**Topics**
+ [Proceso Multipart Upload](#MPUprocess)
+ [Información relevante](#qfacts)
+ [Carga de archivos de gran tamaño mediante el AWS CLI](uploading-an-archive-mpu-using-cli.md)
+ [Carga de archivos grandes por partes con Amazon SDK for Java](uploading-an-archive-mpu-using-java.md)
+ [Carga de archivos de gran tamaño mediante el AWS SDK para .NET](uploading-an-archive-mpu-using-dotnet.md)
+ [Carga de archivos grandes por partes con la API de REST](uploading-an-archive-mpu-using-rest.md)

## Proceso Multipart Upload
<a name="MPUprocess"></a>

Tal y como se describe en [Carga de un archivo en Amazon Glacier](uploading-an-archive.md), recomendamos a nuestros clientes de Amazon Glacier (Amazon Glacier) que utilicen la carga multiparte para cargar archivos superiores a 100 mebibytes (MiB). 

1. **Initiate Multipart Upload** 

   Cuando envía una solicitud para iniciar una carga multiparte, Amazon Glacier devuelve un ID de carga multiparte, que es un identificador único de esta. Cualquier operación de carga multiparte que se ejecute posteriormente necesitará este ID, Este ID se mantendrá en vigor al menos 24 horas después de que Amazon Glacier haya finalizado el trabajo. 

   En la solicitud para iniciar una carga multiparte, especifique el tamaño de la parte en número de bytes. Todas las partes que se carguen, salvo la última, deben tener este tamaño.
**nota**  
Cuando se utiliza las cargas multiparte, no es necesario conocer el tamaño total del archivo. Esto significa que puede utilizar cargas multiparte en los casos en que no sepa el tamaño del archivo cuando comience a cargar el archivo. Cuando inicie una carga multiparte, lo único que debe decidir es el tamaño de la parte.

   En la solicitud Initiate Multipart Upload, también puede proporcionar una descripción opcional del archivo. 

1. **Carga de las partes**

   En cada solicitud de carga, debe incluir el ID de la carga multiparte que obtuvo en el paso 1. En la solicitud, también debe especificar el intervalo de contenido en bytes, lo que identificará la posición de la parte en el archivo final. Amazon Glacier utilizará la información del intervalo de contenido más adelante para montar el archivo en el orden correcto. Como usted proporciona el intervalo de contenido con cada parte que carga, esto determina la posición de la parte en el conjunto final del archivo y, por tanto, puede cargar las partes en cualquier orden. También puede cargar las partes en paralelo. Si carga una parte nueva con el mismo intervalo de contenido que una parte que cargó previamente, la parte existente se sobrescribirá. 

1. **Finalización (o detención) de una carga multiparte**

   Después de cargar todas las partes del archivo, puede utilizar la operación de finalización. Una vez más, debe especificar el ID de carga en la solicitud. Amazon Glacier crea un archivo mediante la concatenación de las partes en orden ascendente en función del intervalo de contenido proporcionado. La respuesta de Amazon Glacier a una solicitud Complete Multipart Upload incluye el ID del archivo que se acaba de crear. Si ha proporcionado una descripción opcional del archivo en la solicitud Initiate Multipart Upload, Amazon Glacier asociará esta descripción al archivo montado. Una vez que una carga multiparte se ha realizado correctamente, no se puede consultar su ID. Esto significa que no puede obtener acceso a las partes asociadas con el ID de carga multiparte.

   Si detiene una carga multiparte, no puede cargar ninguna otra parte con el ID de esa carga. Todo el almacenamiento utilizado por las partes asociadas a la carga multiparte detenida quedará libre. Si la carga de alguna de las partes estuviera en curso, todavía se puede ejecutar correctamente o producir un error una vez detenida.

### Otras operaciones de carga multiparte
<a name="additional-mpu-operations"></a>

Amazon Glacier (Amazon Glacier) ofrece las siguientes llamadas adicionales a la API de carga multiparte.

 
+ **List Parts**: con esta operación, puede enumerar las partes de una determinada carga multiparte. Esta operación devuelve información sobre las partes cargadas en una carga multiparte. En cada solicitud de enumeración de las partes, Amazon Glacier devuelve información de hasta 1000 partes. Si hay más partes para mostrar en la carga multiparte, el resultado se pagina y se devuelve un marcador en la respuesta que señala el punto en el que continúa la lista. Para recuperar las partes siguientes, debe enviar otras solicitudes. Tenga en cuenta que la lista de partes que se devuelve no incluye las partes con carga incompleta.
+ **List Multipart Uploads**: con esta operación, puede obtener una lista de las cargas multiparte en curso. Una carga multiparte en curso es una carga iniciada, pero que aún no se ha completado ni parado. En cada solicitud List Multipart Uploads, Amazon Glacier devuelve un máximo de 1000 cargas multiparte. Si hay más cargas multiparte para mostrar, el resultado se pagina y se devuelve un marcador en la respuesta que señala el punto en el que continúa la lista. Para recuperar las cargas multiparte restantes, debe enviar otras solicitudes.

## Información relevante
<a name="qfacts"></a>

En la siguiente tabla se proporcionan las especificaciones principales de la carga multiparte.


| Elemento | Especificación | 
| --- | --- | 
| Tamaño máximo del archivo | 10 000 x 4 gibibytes (GiB)  | 
| Cantidad máxima de partes por cada carga | 10 000 | 
| Tamaño de parte | 1 MiB a 4 GiB, la última parte puede ser <1 MiB. El tamaño debe especificarse en bytes. El tamaño de la parte debe ser de un mebibyte (1024 kibibytes [KiB]) multiplicado por una potencia de 2. Por ejemplo, `1048576` (1 MiB), `2097152` (2 MiB), `4194304` (4 MiB), `8388608` (8 MiB).   | 
| Cantidad máxima de partes devueltas para una solicitud de lista de partes | 1 000  | 
| Cantidad máxima de cargas multipartes devueltas en una solicitud de lista de cargas multipartes | 1 000  | 

# Carga de archivos de gran tamaño mediante el AWS CLI
<a name="uploading-an-archive-mpu-using-cli"></a>

Puede cargar un archivo en Amazon Glacier (Amazon Glacier) mediante AWS Command Line Interface (AWS CLI). Para mejorar la experiencia de carga de archivos más grandes, Amazon Glacier ofrece varias operaciones de API para admitir las cargas multiparte. Al usar estas operaciones de API, puede cargar los archivos por partes. Estas partes se pueden cargar por separado, en cualquier orden y en paralelo. Si se produce un error al cargar una parte, solo tendrá que volver a cargar esa parte, no el archivo completo. Puede usar la carga multiparte con archivos que tengan un tamaño entre 1 byte hasta 40 000 gibibytes (GiB) aproximadamente. 

Para obtener más información acerca de las cargas multiparte de Amazon Glacier, consulte [Carga de archivos grandes por partes (carga multiparte)](uploading-archive-mpu.md).

**Topics**
+ [(Requisito previo) Configurar el AWS CLI](#Creating-Vaults-CLI-Setup)
+ [(Requisito previo) Instalación de Python](#Uploading-Archives-mpu-CLI-Install-Python)
+ [(Requisito previo) Creación de un almacén de Amazon Glacier](#Uploading-Archives-mpu-CLI-Create-Vault)
+ [Ejemplo: cargar archivos grandes en partes mediante el AWS CLI](#Uploading-Archives-mpu-CLI-Implementation)

## (Requisito previo) Configurar el AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Descargue y configure la AWS CLI. Para obtener instrucciones, consulte los siguientes temas en la *Guía del usuario de la AWS Command Line Interface *: 

    [Instalación del AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

   [Configuración del AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

1. Compruebe AWS CLI la configuración introduciendo los siguientes comandos en la línea de comandos. Estos comandos no proporcionan las credenciales de forma explícita, por lo que se utilizan las credenciales del perfil predeterminado.
   + Pruebe a usar el comando de ayuda.

     ```
     aws help
     ```
   + Para obtener una lista de los almacenes de Amazon Glacier en la cuenta configurada, use el comando `list-vaults`. *123456789012*Sustitúyala por tu Cuenta de AWS ID.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Para ver los datos de configuración actuales de AWS CLI, utilice el `aws configure list` comando.

     ```
     aws configure list
     ```

## (Requisito previo) Instalación de Python
<a name="Uploading-Archives-mpu-CLI-Install-Python"></a>

Para completar una carga multiparte, debe calcular el hash de SHA256 árbol del archivo que va a cargar. Hacerlo no es lo mismo que calcular el hash de SHA256 árbol del archivo que quieres subir. Para calcular el hash de SHA256 árbol del archivo que estás cargando, puedes usar Java C\$1 (con.NET) o. Python En este ejemplo, se usará Python. Para obtener instrucciones sobre cómo usar Java o C\$1, consulte [Cálculo de sumas de comprobación](checksum-calculations.md). 

Para obtener más información sobre la instalación de Python, consulte [Instalar o actualizar Python](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation) en la *guía para desarrolladores de Boto3*.

## (Requisito previo) Creación de un almacén de Amazon Glacier
<a name="Uploading-Archives-mpu-CLI-Create-Vault"></a>

Para usar el siguiente ejemplo, debe haber creado al menos un almacén de Amazon Glacier. Para obtener más información acerca de la creación de almacenes, consulte [Creación de un almacén en Amazon Glacier](creating-vaults.md).

## Ejemplo: cargar archivos grandes en partes mediante el AWS CLI
<a name="Uploading-Archives-mpu-CLI-Implementation"></a>

En este ejemplo, creará un archivo y utilizará operaciones de la API de carga multiparte para cargarlo, por partes, en Amazon Glacier.
**importante**  
Antes de comenzar con este procedimiento, asegúrese de haber realizado todos los pasos que sean requisitos previos. Para cargar un archivo, debe crear un almacén, AWS CLI configurarlo y estar preparado para usar Java C\$1 o Python calcular un hash de SHA256 árbol.

En el siguiente procedimiento se utilizan los `complete-multipart-upload` AWS CLI comandos `initiate-multipart-upload``upload-multipart-part`, y. 

Para obtener más detallada sobre cada uno de estos comandos, consulte [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html), [https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html) y [https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html) en la *Referencia de los comandos de la AWS CLI *.

1. Utilice el comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html) para crear un recurso de carga multiparte. En la solicitud, especifique el tamaño de la parte en número de bytes. Todas las partes que se carguen, salvo la última, tendrán este tamaño. Al iniciar una carga, no es necesario saber el tamaño total del archivo. Sin embargo, necesitará el tamaño total (en bytes) de cada una de las partes al completar la carga en el paso final.

   En el siguiente comando, reemplace los valores de los parámetros `--vault-name` y `--account-ID` por su información propia. Este comando especifica que cargará un archivo con un tamaño de parte de 1 mebibyte (MiB) (1024 x 1024 bytes) por archivo. Sustituya el valor del parámetro `--part-size` si es necesario. 

   ```
   aws glacier initiate-multipart-upload --vault-name awsexamplevault --part-size 1048576 --account-id 123456789012
   ```

   Resultado previsto:

   ```
   {
   "location": "/123456789012/vaults/awsexamplevault/multipart-uploads/uploadId",
   "uploadId": "uploadId"
   }
   ```

   Cuando termine, el comando mostrará el ID de carga y la ubicación del recurso de carga multiparte en Amazon Glacier. Este ID de carga se usará en los pasos posteriores.

1. Para este ejemplo, puede usar los siguientes comandos para crear un archivo de 4,4 MiB, dividirlo en fragmentos de 1 MiB y cargar cada uno de los fragmentos. Para cargar sus propios archivos, puede seguir un procedimiento similar: dividir los datos en fragmentos y cargar cada una de las partes. 

   

**Linux o macOS**  
El siguiente comando crea un archivo de 4,4 MiB denominado `file_to_upload` en Linux o macOS.

   ```
   mkfile -n 9000b file_to_upload
   ```

**Windows**  
El siguiente comando crea un archivo de 4,4 MiB denominado `file_to_upload` en Windows.

   ```
   fsutil file createnew file_to_upload 4608000
   ```

1. A continuación, dividirá este archivo en fragmentos de 1 MiB. 

   ```
   split -b 1048576 file_to_upload chunk
   ```

   Ahora tiene los cinco fragmentos siguientes. Los cuatro primeros son de 1 MiB y el último es de aproximadamente 400 kibibytes (KiB). 

   ```
   chunkaa
   chunkab
   chunkac
   chunkad
   chunkae
   ```

1. Use el comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html) para cargar una parte de un archivo. Las partes de archivo se pueden cargar en cualquier orden. También puede cargarlas en paralelo. En una carga multiparte, se pueden cargar hasta 10 000 partes.

   En el siguiente comando, reemplace los valores de los parámetros `--vault-name`, `--account-ID` y `--upload-id`. El ID de carga debe coincidir con el ID proporcionado como salida del comando `initiate-multipart-upload`. El parámetro `--range` especifica que cargará una parte con un tamaño de 1 MiB (1024 x 1024 bytes). Este tamaño debe coincidir con el especificado en el comando `initiate-multipart-upload`. Ajuste este valor de tamaño si es necesario. El parámetro `--body` especifica el nombre de la parte que está cargando.

   ```
   aws glacier upload-multipart-part --body chunkaa --range='bytes 0-1048575/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   Si se ejecuta correctamente, el comando generará un resultado que contiene la suma de comprobación de la parte cargada.

1. Vuelva a ejecutar el comando `upload-multipart-part` para cargar las partes restantes de la carga multiparte. Actualice los valores de los parámetros `--range` y `–-body` de cada comando para que coincidan con la parte que está cargando. 

   ```
   aws glacier upload-multipart-part --body chunkab --range='bytes 1048576-2097151/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkac --range='bytes 2097152-3145727/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkad --range='bytes 3145728-4194303/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkae --range='bytes 4194304-4607999/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```
**nota**  
El valor del parámetro `--range` del comando final es más pequeño porque la parte final de nuestra carga es inferior a 1 MiB. Si se ejecuta correctamente, cada comando generará un resultado que contiene la suma de comprobación de cada parte cargada.

1. A continuación, se ensamblará el archivo y se finalizará la carga. Debe incluir el tamaño total y el hash de SHA256 árbol del archivo.

   Para calcular el hash de SHA256 árbol del archivo, puede usar Java C\$1 oPython. En este ejemplo, se usará Python. Para obtener instrucciones sobre cómo usar Java o C\$1, consulte [Cálculo de sumas de comprobación](checksum-calculations.md).

   Cree el archivo `checksum.py` de Python e inserte el código siguiente. Si es necesario, sustituya el nombre del archivo original.

   ```
   from botocore.utils import calculate_tree_hash
   					
   checksum = calculate_tree_hash(open('file_to_upload', 'rb'))
   print(checksum)
   ```

1. Ejecute `checksum.py` para calcular el hash del SHA256 árbol. Es posible que el hash siguiente no coincida con la salida.

   ```
   $ python3 checksum.py
   $ 3d760edb291bfc9d90d35809243de092aea4c47b308290ad12d084f69988ae0c
   ```

1. Use el comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html) para finalizar la carga del archivo. Sustituya los valores de los parámetros `--vault-name`, `--account-ID`, `--upload-ID` y `--checksum`. El valor del parámetro `--archive` especifica el tamaño total del archivo en bytes. Este valor debe ser la suma de todos los tamaños de las partes individuales que ha cargado. Sustituya este valor si es necesario. 

   ```
   aws glacier complete-multipart-upload --archive-size 4608000 --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID --checksum checksum
   ```

   Al finalizar, el comando mostrará el ID, la suma de comprobación y la ubicación del archivo en Amazon Glacier. 

# Carga de archivos grandes por partes con Amazon SDK for Java
<a name="uploading-an-archive-mpu-using-java"></a>

Tanto el [nivel alto como el nivel bajo](using-aws-sdk.md) que APIs proporciona Amazon SDK for Java proporcionan un método para cargar un archivo grande (consulte[Carga de un archivo en Amazon Glacier](uploading-an-archive.md)). 

 
+ 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 Glacier (Amazon 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 el nivel alto y el nivel bajo APIs, consulte. [Uso del AWS SDK para Java con Amazon Glacier](using-aws-sdk-for-java.md)

**Topics**
+ [Carga de archivos grandes en partes mediante la API de alto nivel del AWS SDK para Java](#uploading-an-archive-in-parts-highlevel-using-java)
+ [Cargue archivos grandes en partes utilizando la API de bajo nivel del AWS SDK para Java](#uploading-an-archive-mpu-using-java-lowlevel)

## Carga de archivos grandes en partes mediante la API de alto nivel del AWS SDK para Java
<a name="uploading-an-archive-in-parts-highlevel-using-java"></a>

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 Amazon Glacier. Para obtener más información, consulte [Carga de un archivo mediante la API de alto nivel del AWS SDK para Java](uploading-an-archive-single-op-using-java.md#uploading-an-archive-single-op-high-level-using-java).

## Cargue archivos grandes en partes utilizando la API de bajo nivel del AWS SDK para Java
<a name="uploading-an-archive-mpu-using-java-lowlevel"></a>

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 para Java.

 

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

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

1. 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 que desea usar para cargar cada parte de archivo y una descripción opcional. Puede facilitar esta información creando una instancia de la clase `InitiateMultipartUploadRequest`. En respuesta, Amazon Glacier devuelve un ID de carga.

1. 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. 

1. 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. Amazon Glacier construye el archivo a partir de las partes cargadas y devuelve un ID de archivo.

### Ejemplo: carga de un archivo grande en una pieza mediante el AWS SDK para Java
<a name="upload-archive-mpu-java-example"></a>

El siguiente ejemplo de código Java utiliza el AWS SDK para Java para cargar un archivo en un almacén (`examplevault`). Para step-by-step obtener instrucciones sobre cómo ejecutar este ejemplo, consulte[Ejecución de ejemplos de Java para Amazon Glacier con Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). Debe actualizar el código mostrado con el nombre del archivo que quiera cargar.

 

**nota**  
Este ejemplo es válido para tamaños parte de 1 MB a 1 GB. Sin embargo, Amazon Glacier admite tamaños de partes de hasta 4 GB. 

**Example**  

```
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.TreeHashGenerator;
import com.amazonaws.services.glacier.model.CompleteMultipartUploadRequest;
import com.amazonaws.services.glacier.model.CompleteMultipartUploadResult;
import com.amazonaws.services.glacier.model.InitiateMultipartUploadRequest;
import com.amazonaws.services.glacier.model.InitiateMultipartUploadResult;
import com.amazonaws.services.glacier.model.UploadMultipartPartRequest;
import com.amazonaws.services.glacier.model.UploadMultipartPartResult;
import com.amazonaws.util.BinaryUtils;

public class ArchiveMPU {

    public static String vaultName = "examplevault";
    // This example works for part sizes up to 1 GB.
    public static String partSize = "1048576"; // 1 MB.
    public static String archiveFilePath = "*** provide archive file path ***";
    public static AmazonGlacierClient client;
    
    public static void main(String[] args) throws IOException {

    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();

        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier.us-west-2.amazonaws.com/");

        try {
            System.out.println("Uploading an archive.");
            String uploadId = initiateMultipartUpload();
            String checksum = uploadParts(uploadId);
            String archiveId = CompleteMultiPartUpload(uploadId, checksum);
            System.out.println("Completed an archive. ArchiveId: " + archiveId);
            
        } catch (Exception e) {
            System.err.println(e);
        }

    }
    
    private static String initiateMultipartUpload() {
        // Initiate
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest()
            .withVaultName(vaultName)
            .withArchiveDescription("my archive " + (new Date()))
            .withPartSize(partSize);            
        
        InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
        
        System.out.println("ArchiveID: " + result.getUploadId());
        return result.getUploadId();
    }

    private static String uploadParts(String uploadId) throws AmazonServiceException, NoSuchAlgorithmException, AmazonClientException, IOException {

        int filePosition = 0;
        long currentPosition = 0;
        byte[] buffer = new byte[Integer.valueOf(partSize)];
        List<byte[]> binaryChecksums = new LinkedList<byte[]>();
        
        File file = new File(archiveFilePath);
        FileInputStream fileToUpload = new FileInputStream(file);
        String contentRange;
        int read = 0;
        while (currentPosition < file.length())
        {
            read = fileToUpload.read(buffer, filePosition, buffer.length);
            if (read == -1) { break; }
            byte[] bytesRead = Arrays.copyOf(buffer, read);

            contentRange = String.format("bytes %s-%s/*", currentPosition, currentPosition + read - 1);
            String checksum = TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(bytesRead));
            byte[] binaryChecksum = BinaryUtils.fromHex(checksum);
            binaryChecksums.add(binaryChecksum);
            System.out.println(contentRange);
                        
            //Upload part.
            UploadMultipartPartRequest partRequest = new UploadMultipartPartRequest()
            .withVaultName(vaultName)
            .withBody(new ByteArrayInputStream(bytesRead))
            .withChecksum(checksum)
            .withRange(contentRange)
            .withUploadId(uploadId);               
        
            UploadMultipartPartResult partResult = client.uploadMultipartPart(partRequest);
            System.out.println("Part uploaded, checksum: " + partResult.getChecksum());
            
            currentPosition = currentPosition + read;
        }
        fileToUpload.close();
        String checksum = TreeHashGenerator.calculateTreeHash(binaryChecksums);
        return checksum;
    }

    private static String CompleteMultiPartUpload(String uploadId, String checksum) throws NoSuchAlgorithmException, IOException {
        
        File file = new File(archiveFilePath);

        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest()
            .withVaultName(vaultName)
            .withUploadId(uploadId)
            .withChecksum(checksum)
            .withArchiveSize(String.valueOf(file.length()));
        
        CompleteMultipartUploadResult compResult = client.completeMultipartUpload(compRequest);
        return compResult.getLocation();
    }
}
```

# Carga de archivos de gran tamaño mediante el AWS SDK para .NET
<a name="uploading-an-archive-mpu-using-dotnet"></a>

Tanto el [nivel alto como el nivel bajo](using-aws-sdk.md) que APIs proporciona Amazon SDK para .NET proporcionan un método para cargar archivos grandes en partes (consulte[Carga de un archivo en Amazon Glacier](uploading-an-archive.md)). 

 
+ 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 Glacier (Amazon 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 el nivel alto y el nivel bajo APIs, consulte. [Uso de AWS SDK para .NET con Amazon Glacier](using-aws-sdk-for-dot-net.md)

**Topics**
+ [Carga de archivos grandes en partes mediante la API de alto nivel del AWS SDK para .NET](#uploading-an-archive-in-parts-highlevel-using-dotnet)
+ [Carga de archivos grandes en partes mediante la API de bajo nivel del AWS SDK para .NET](#uploading-an-archive-in-parts-lowlevel-using-dotnet)

## Carga de archivos grandes en partes mediante la API de alto nivel del AWS SDK para .NET
<a name="uploading-an-archive-in-parts-highlevel-using-dotnet"></a>

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 Amazon Glacier. Para obtener más información, consulte [Carga de un archivo mediante la API de alto nivel del AWS SDK para .NET](uploading-an-archive-single-op-using-dotnet.md#uploading-an-archive-single-op-highlevel-using-dotnet).

## Carga de archivos grandes en partes mediante la API de bajo nivel del AWS SDK para .NET
<a name="uploading-an-archive-in-parts-lowlevel-using-dotnet"></a>

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 para .NET.

 

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

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

1. 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, Amazon Glacier devuelve un ID de carga.

1. 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. 

1. 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. Amazon 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
<a name="upload-archive-mpu-dotnet-example"></a>

El siguiente ejemplo de código de C\$1 utiliza el AWS SDK para .NET para cargar un archivo en una bóveda (`examplevault`). Para step-by-step obtener instrucciones sobre cómo ejecutar este ejemplo, consulte[Ejecución de los ejemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). Debe actualizar el código mostrado con el nombre del archivo que quiera cargar.

**Example**  

```
using System;
using System.Collections.Generic;
using System.IO;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.us.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;
    }
  }
}
```

# Carga de archivos grandes por partes con la API de REST
<a name="uploading-an-archive-mpu-using-rest"></a>

Tal y como se explica en [Carga de archivos grandes por partes (carga multiparte)](uploading-archive-mpu.md), el término "carga multiparte" hace referencia a un conjunto de operaciones que permiten cargar un archivo por partes y ejecutar operaciones relacionadas. Para obtener más información sobre estas operaciones, consulte los siguientes temas de referencia de las API:

 
+ [Inicio de la carga multiparte (POST cargas-multiparte)](api-multipart-initiate-upload.md)
+ [Carga de partes (PUT uploadID)](api-upload-part.md)
+ [Finalización de una carga multiparte (POST uploadID)](api-multipart-complete-upload.md)
+ [Anulación de la carga multiparte (DELETE uploadID)](api-multipart-abort-upload.md)
+ [Enumeración de partes (GET uploadID)](api-multipart-list-parts.md)
+ [Enumeración de cargas multiparte (GET cargas-multiparte)](api-multipart-list-uploads.md)