

# Carga de objetos
<a name="upload-objects"></a>

Al cargar un archivo en Amazon S3, se guarda como un *objeto* de S3. Los objetos constan de los datos y metadatos del archivo que describen el objeto. Puede haber un número ilimitado de objetos en un bucket. Para poder cargar archivos en un bucket de Amazon S3, debe escribir permisos para el bucket. Para obtener más información acerca de los permisos de acceso, consulte [Administración de identidades y accesos para Amazon S3](security-iam.md). 

Puede cargar cualquier tipo de archivo, como imágenes, copias de seguridad, datos, películas, etc., en un bucket de S3. El tamaño máximo de un archivo que puede cargar con la consola de Amazon S3 es de 160 GB. Para cargar un archivo que sobrepase los 160 GB de tamaño, utilice la AWS Command Line Interface (AWS CLI), el SDK de AWS o la API de REST de Amazon S3.

Si carga un objeto con un nombre de clave que ya existe en un bucket con el control de versiones activado, Amazon S3 crea otra versión del objeto en vez de reemplazar el objeto existente. Para obtener más información sobre la habilitación del control de versiones, consulte [Habilitar el control de versiones en buckets](manage-versioning-examples.md).

 En función del tamaño de los datos que cargue, Amazon S3 ofrece las siguientes opciones: 
+ **Cargar un objeto en una única operación mediante los SDK de AWS, la API de REST o la AWS CLI**: con una única operación `PUT`, se puede cargar un único objeto de hasta 5 GB.
+ **Cargar un solo objeto mediante la consola de Amazon S3****:** con la consola de Amazon S3, se puede cargar un único objeto de hasta 160 GB. 
+ **Cargar un objeto en partes mediante los SDK de AWS, la API de REST o la AWS CLI****:** con la API de carga multiparte, se puede cargar un solo objeto grande, de hasta 50 TB.

  La operación de la API de carga multiparte está diseñada para mejorar la experiencia de carga para objetos más grandes. Puede cargar un objeto en partes. Estas partes de objetos se pueden cargar independientemente, en cualquier orden y en paralelo. Puede usar una carga multiparte para objetos que ocupen de 5 MB a 50 TB. Para obtener más información, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

Para cargar archivos de más de 5 TB, utilice el S3 Transfer Manager en Java v1/v2, Python o AWS CLI SDK. Para obtener el mejor rendimiento, utilice la versión más reciente de AWS Common Runtime (CRT) con estos SDK, que se ha optimizado para utilizar mejor los recursos.

Al cargar objetos grandes desde un flujo de memoria, CRT almacena cada parte en un búfer de memoria de hasta 5 GB, lo que limita el rendimiento total de la memoria asignada. Puede ajustar el límite de memoria de CRT mediante opciones de configuración, como las de `maxNativeMemoryLimitInBytes` SDK para Java. En el caso de las cargas desde el disco, CRT cambia automáticamente a la transmisión directa del disco en lugar de almacenar en búfer las partes intermedias, lo que mejora el uso de la memoria. Este comportamiento se habilita automáticamente para objetos grandes, pero también se puede habilitar para archivos más pequeños mediante parámetros de solicitud, como `should_stream` para la AWS CLI y `CRT_MEMORY_BUFFER_DISABLED` para el SDK de Java.

Cuando se carga un objeto, el objeto se cifra automáticamente mediante cifrado del lado del servidor con claves administradas de Amazon S3 (SSE-S3) de forma predeterminada. Al descargarlo, el objeto se descifra. Para obtener más información, consulte [Establecer el comportamiento del cifrado predeterminado del lado del servidor para los buckets de Amazon S3](bucket-encryption.md) y [Protección de los datos mediante el cifrado](UsingEncryption.md). 

Al cargar un objeto, si quiere utilizar un tipo de cifrado predeterminado diferente, también puede especificar el cifrado del lado del servidor con claves de AWS Key Management Service (AWS KMS) (SSE-KMS) en sus solicitudes `PUT` de S3 o definir la configuración de cifrado predeterminada en el bucket de destino para usar SSE-KMS para cifrar los datos. Para obtener más información sobre SSE-KMS, consulte [Especificación del cifrado del lado del servidor con AWS KMS (SSE-KMS)](specifying-kms-encryption.md). Si desea utilizar una clave de KMS propiedad de una cuenta diferente, primero debe tener permiso para utilizar la clave. Para obtener más información sobre los permisos entre cuentas para las claves de KMS, consulte [Crear claves de KMS que otras cuentas puedan utilizar](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console) en la *Guía para desarrolladores de AWS Key Management Service*. 

Si aparece un error Access Denied (403 Forbidden) en Amazon S3, consulte [Solución de problemas de errores de acceso rechazado (403 Forbidden) en Amazon S3](troubleshoot-403-errors.md) para obtener más información sobre las causas comunes de dicho error.

## Cargar un objeto
<a name="upload-objects-procedure"></a>

### Uso de la consola de S3
<a name="upload-objects-by-drag-and-drop"></a>

Este procedimiento explica cómo cargar objetos y carpetas a un bucket de Amazon S3 mediante la consola. 

Cuando carga un objeto, el nombre de la clave de objeto es el nombre del archivo y los prefijos opcionales. En la consola de Amazon S3, puede crear carpetas para organizar sus objetos. En Amazon S3, las carpetas se representan como prefijos que aparecen en el nombre de la clave de objeto. Si carga un objeto individual en una carpeta de la consola de Amazon S3, el nombre de la carpeta se incluirá en el nombre de la clave de objeto. 

Por ejemplo, si carga un objeto denominado `sample1.jpg` en una carpeta denominada `backup`, el nombre de la clave es `backup/sample1.jpg`. Sin embargo, el objeto se mostrará en la consola como `sample1.jpg` la carpeta `backup`. Para obtener más información sobre nombres de clave, consulte [Trabajar con metadatos de objeto](UsingMetadata.md).

**nota**  
Si cambia el nombre de un objeto o cambia cualquiera de las propiedades de la consola de Amazon S3 (por ejemplo, la **clase de almacenamiento**, el **cifrado** o los **metadatos**), se crea un nuevo objeto para reemplazar el anterior. Si el control de versiones de S3 está activado, se crea una nueva versión del objeto y el objeto existente se convierte en una versión anterior. El rol que cambia la propiedad también se convierte en el propietario del nuevo objeto o (versión del objeto).

Cuando carga una carpeta, Amazon S3 carga todos los archivos y subcarpetas de la carpeta especificada en su bucket. Luego asigna un nombre de clave de objeto, que es una combinación del nombre del archivo cargado y el nombre de la carpeta. Por ejemplo, si carga una carpeta denominada `/images` que contiene dos archivos, `sample1.jpg` y `sample2.jpg`, Amazon S3 carga los archivos y les asigna los nombres de clave correspondientes, `images/sample1.jpg` e `images/sample2.jpg`. Los nombres de clave incluyen el nombre de la carpeta como un prefijo. La consola de Amazon S3 muestra solo la parte del nombre de clave siguiente a la última `/`. Por ejemplo, dentro de una carpeta `images`, los objetos `images/sample1.jpg` y `images/sample2.jpg` se muestran como `sample1.jpg` y `sample2.jpg`.<a name="upload-files-folders"></a>

**Para cargar carpetas y archivos a un bucket de S3**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon S3 en [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. En el panel de navegación izquierdo, elija **Buckets**.

1. En la lista **Buckets**, elija el nombre del bucket en el que desea cargar sus carpetas o archivos.

1. Seleccione **Cargar**.

1. En la ventana **Cargar**, realice una de las siguientes acciones: 
   + Arrastre y suelte archivos y carpetas en la ventana **Cargar**.
   + Elija **Agregar archivo** o **Agregar carpeta**, elija los archivos o carpetas que desee cargar y **Abrir**.

1. Para habilitar el control de versiones, en **Destino**, seleccione **Activar control de versiones de bucket**.

1. Para cargar los archivos y carpetas enumerados sin configurar opciones de carga adicionales, en la parte inferior de la página, seleccione **Cargar**.

   Amazon S3 carga sus objetos y carpetas. Cuando finalice la carga, puede ver un mensaje de éxito en la página **Cargar: estado**.<a name="configure-additional-properties"></a>

**Para configurar propiedades de objeto adicionales**

1. Para cambiar los permisos de la lista de control de acceso, elija **Permissions (Permisos)**.

1. En **Access control list (ACL) (Lista de control de acceso [ACL])**, edite los permisos.

   Para obtener información acerca de los permisos de acceso a objetos, consulte [Uso de la consola S3 para establecer permisos de ACL para un objeto](managing-acls.md#set-object-permissions). Puede conceder acceso de lectura a los objetos al público (a todo el mundo) para todos los archivos que esté cargando. Sin embargo, recomendamos no cambiar la configuración predeterminada para el acceso de lectura pública. Otorgar acceso de lectura público es aplicable a un pequeño conjunto de casos de uso, por ejemplo cuando los buckets se utilizan para sitios web. Siempre puede cambiar los permisos del objeto después de cargarlo. 

1. Para configurar otras propiedades, elija **Propiedades**.

1. En la sección **Clase de almacenamiento**, elija la clase de almacenamiento para los archivos que esté cargando.

   Para obtener más información acerca de las clases de almacenamiento, consulte [Descripción y administración de clases de almacenamiento de Amazon S3](storage-class-intro.md).

1. Para actualizar la configuración de cifrado de los objetos, en **Server-side encryption settings** (Configuración de cifrado del lado del servidor), haga lo siguiente.

   1. Elija **Specify an encryption key (Especificar una clave de cifrado)**.

   1. En **Configuración del cifrado**, elija **Usar la configuración del bucket para el cifrado predeterminado** o **Anular la configuración del bucket para el cifrado predeterminado**.

   1. Si elige **Anular la configuración del bucket para el cifrado predeterminado**, debe configurar los siguientes ajustes de cifrado.
      + Para cifrar los archivos cargados con claves que administra Amazon S3, seleccione **Clave administrada de Amazon S3 (SSE-S3)**.

        Para obtener más información, consulte [Uso del cifrado del servidor con claves administradas por Amazon S3 (SSE-S3)](UsingServerSideEncryption.md).
      + Si desea cifrar los archivos cargados mediante claves almacenadas en AWS Key Management Service (AWS KMS), elija la **Clave de AWS Key Management Service (SSE-KMS)**. A continuación, elija una de las siguientes opciones para la **clave de AWS KMS**:
        + Para seleccionar en una lista de claves de KMS disponibles, marque **Elija entre sus claves de AWS KMS keys** y seleccione su **clave de KMS** de la lista de claves disponibles.

          En esta lista aparecen tanto la Clave administrada de AWS (`aws/s3`) como las claves administradas por el cliente. Para obtener más información acerca de las claves administradas por el cliente, consulte [Claves de cliente y claves de AWS](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt) en la *Guía para desarrolladores de AWS Key Management Service*.
        + Para introducir el ARN de la clave de KMS, elija **Introducir el ARN de la clave de AWS KMS key** e introduzca el ARN de la clave de KMS en el campo que aparece. 
        + Para crear una nueva clave administrada por el cliente en la consola de AWS KMS, elija **Crear una clave de KMS**.

          Para obtener más información acerca de cómo crear una AWS KMS key, consulte [Creación de claves](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html) en la *AWS Key Management Service Guía para desarrolladores*.
**importante**  
Solo puede utilizar las claves de KMS que estén disponibles en la misma Región de AWS del bucket. La consola de Amazon S3 solo muestra las primeras 100 claves de KMS de la misma región del bucket. Para utilizar una clave de KMS que no aparezca en la lista, debe introducir el ARN de la clave de KMS. Si desea utilizar una clave de KMS propiedad de una cuenta de diferente, primero debe tener permiso para utilizar la clave y, después, debe introducir el ARN de la clave de KMS.   
Amazon S3 admite solo claves de KMS de cifrado simétricas y no claves de KMS asimétricas. Para obtener más información, consulte [Identificación de claves de KMS simétricas y asimétricas](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html) en la *Guía para desarrolladores de AWS Key Management Service*.

1. Para utilizar sumas de comprobación adicionales, elija **On (Activado)**. A continuación, en **Checksum function (Función de suma de comprobación)**, elija la función que desearía utilizar. Amazon S3 calcula y almacena el valor de la suma de comprobación después de recibir todo el objeto. Puede utilizar el recuadro **Precalculated value (Valor precalculado)** para proporcionar un valor precalculado. Si lo hace, Amazon S3 compara el valor que proporcionó con el valor que calcula. Si los valores no coinciden, Amazon S3 genera un error.

   Las sumas de comprobación adicionales le permiten especificar el algoritmo de suma de comprobación que desea utilizar para verificar los datos. Para obtener más información sobre sumas de comprobación adicionales, consulte [Comprobación de la integridad de objetos en Amazon S3](checking-object-integrity.md).

1. Para agregar etiquetas a todos los objetos que va a cargar, elija **Add tag** (Agregar etiqueta). Escriba un nombre de etiqueta en el campo **Clave**. Ingrese un valor para la etiqueta.

   El etiquetado de objetos le permite categorizar el almacenamiento. Cada etiqueta es un par clave-valor. Los valores de clave y de etiqueta distinguen entre mayúsculas y minúsculas. Puede tener hasta 10 etiquetas por cada objeto. Una clave de etiqueta puede tener una longitud de hasta 128 caracteres Unicode y los valores de etiqueta pueden tener una longitud de hasta 255 caracteres Unicode. Para obtener más información acerca de las etiquetas de objeto, consulte [Categorización de los objetos mediante etiquetas](object-tagging.md).

1. Para agregar metadatos, elija **Agregar metadatos**.

   1. En **Tipo**, elija **Definidos por el sistema** o **Definidos por el usuario**.

      Para los metadatos definidos por el sistema, puede seleccionar encabezados HTTP comunes, como **Tipo de contenido** y **Disposición de contenido**. Para obtener una lista de metadatos definidos por el sistema e información sobre si puede agregar el valor, consulte [Metadatos de objetos definidos por el sistema](UsingMetadata.md#SysMetadata). Cualquier metadato que comience con el prefijo `x-amz-meta-` se trata como metadato definido por el usuario. Los metadatos definidos por el usuario se almacenan con el objeto y se devuelven cuando lo descarga. Tanto las claves como sus valores deben cumplir los estándares ASCII de EE. UU. Los metadatos definidos por el usuario pueden tener un tamaño de hasta 2 KB. Para obtener más información acerca de los metadatos definidos por el sistema y por el usuario, consulte [Trabajar con metadatos de objeto](UsingMetadata.md).

   1. En **Clave**, elija una clave.

   1. Escriba un valor para la clave. 

1. Para cargar los objetos, seleccione **Cargar**.

   Amazon S3 carga su objeto. Cuando finalice la carga, puede ver un mensaje de éxito en la página **Cargar: estado**.

1. Seleccione **Salir**.

### Mediante AWS CLI
<a name="UploadObjSingleOpCLI"></a>

Envíe una solicitud `PUT` para cargar un objeto de hasta 5 GB en una única operación. Para obtener más información, consulte el ejemplo de [https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html#examples](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html#examples) en la *referencia de comandos de AWS CLI*.

### Uso de la API de REST
<a name="UploadObjSingleOpREST"></a>

Puede enviar solicitudes REST para cargar un objeto. Puede enviar una solicitud `PUT` para cargar datos en una única operación. Para obtener más información, consulte [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html).

### Uso de los AWS SDK
<a name="UploadInSingleOp"></a>

Para ver ejemplos de cómo cargar un objeto con los AWS SDK, consulte [Ejemplos de código](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_PutObject_section.html) en la *Referencia de la API de Amazon Simple Storage Service*.

Para obtener información general sobre el uso de diferentes AWS SDK, consulte [Desarrollo con Amazon S3 mediante los AWS SDK](https://docs.aws.amazon.com/AmazonS3/latest/API/sdk-general-information-section.html) en la *Referencia de la API de Amazon Simple Storage Service*.

## Impedimento para que se carguen objetos con nombres de claves idénticos
<a name="upload-objects-with-same-key-name"></a>

Puede comprobar la existencia de un objeto en el bucket antes de crearlo mediante una operación condicional de escritura al cargar. Esto puede evitar que se sobrescriban los datos existentes. Las escrituras condicionales validarán que no haya ningún objeto existente con el mismo nombre de clave en el bucket al cargar.

Puede usar escrituras condicionales para las solicitudes de [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) o [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html).

Para obtener más información sobre las solicitudes condicionales, consulte [Agregación de condiciones previas a operaciones de S3 con solicitudes condicionales](conditional-requests.md).

# Carga y copia de objetos con la carga multiparte en Amazon S3
<a name="mpuoverview"></a>

La carga multiparte permite cargar un solo objeto en Amazon S3 como un conjunto de partes. Cada parte es una parte contigua de los datos del objeto. Puede cargar estas partes del objeto de forma independiente y en cualquier orden. Para las cargas, el cliente de AWS actualizado calcula automáticamente una suma de comprobación del objeto y la envía a Amazon S3 junto con el tamaño del objeto como parte de la solicitud. Si la transmisión de cualquier parte falla, puede retransmitir esta parte sin que las demás partes se vean afectadas. Una vez cargadas todas las partes del objeto, Amazon S3 las ensambla para crear el objeto. Es una práctica recomendada utilizar la carga multiparte para objetos de 100 MB o más en lugar de cargarlos en una sola operación.

El uso de la carga multiparte proporciona las siguientes ventajas:
+ **Mayor rendimiento**: puede cargar las partes al mismo tiempo para aumentar el rendimiento. 
+ **Recuperación rápida ante cualquier problema de red**: una parte de tamaño más pequeño reduce el impacto de tener que reiniciar una carga fallida debido a un error de red.
+ **Detención y reanudación de cargas de objetos**: puede cargar las partes del objeto con el paso del tiempo. Después de que inicia una carga multiparte, no hay fecha de caducidad, por lo tanto, debe completar o detener de forma explícita la carga multiparte.
+ **Inicio de una carga antes de conocer el tamaño final del objeto**: puede cargar un objeto a medida que lo crea. 

Le recomendamos que use la carga multiparte de las siguientes maneras:
+ Si carga objetos grandes en una red estable de banda ancha, use la carga multiparte para aumentar al máximo el uso del ancho de banda disponible mediante la carga de los objetos en partes y en paralelo para obtener un rendimiento en varios subprocesos.
+ Si realiza la carga en una red irregular, utilice la carga multiparte para aumentar la resiliencia ante errores de red evitando reinicios de la carga. Al usar la carga multiparte, debe volver a intentar cargar solo las partes que se han interrumpido durante la carga. No necesita reiniciar la carga de su objeto desde el principio.

**nota**  
Para obtener más información sobre el uso de la clase de almacenamiento Amazon S3 Express One Zone con buckets de directorio, consulte [S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) y [Trabajar con buckets de de directorio](directory-buckets-overview.md). Para obtener más información sobre el uso de una carga multiparte con S3 Express One Zone y buckets de directorio, consulte [Uso de las cargas multiparte con buckets de directorio](s3-express-using-multipart-upload.md).

## Proceso de carga multiparte
<a name="mpu-process"></a>

La carga multiparte es un proceso de tres pasos: inicia la carga, carga las partes del objeto y, después de haber cargado todas las partes, completa la carga multiparte. Al recibir la solicitud de carga multiparte completa, Amazon S3 crea el objeto a partir de las partes cargadas para que pueda obtener acceso al objeto como lo haría con cualquier otro objeto del bucket. 

Puede mostrar todas las cargas multipartes en curso u obtener una lista de las partes que ha cargado en una carga multiparte específica. En esta sección, se explicarán cada una de estas operaciones.

**Inicio de la carga multiparte**  
Cuando envíe una solicitud para iniciar una carga multiparte, asegúrese de especificar un tipo de suma de comprobación. Amazon S3 devolverá una respuesta con un ID de carga, que es un identificador único para la carga multiparte. Este ID de carga es necesario cuando se cargan partes, se enumeran partes, se completa una carga o se detiene una carga. Si desea proporcionar metadatos que describen el objeto que se está cargando, debe proporcionarlos en la solicitud para iniciar la carga multiparte. Los usuarios anónimos no pueden iniciar cargas multiparte.

**Carga de partes**  
Al cargar una parte, debe especificar un número de parte además del ID de carga. Puede seleccionar cualquier número de parte comprendido entre 1 y 10 000. Un número de parte identifica exclusivamente una parte y su posición en el objeto que se está cargando. El número de parte que elija no tiene que ser necesariamente una secuencia consecutiva (por ejemplo: puede ser 1, 5 y 14). Tenga en cuenta que si carga una parte nueva con el mismo número que una parte ya cargada, se sobrescribirá la parte existente. 

Cuando carga una parte, Amazon S3 devuelve el tipo de algoritmo de suma de comprobación con el valor de suma de comprobación para cada parte como encabezado en la respuesta. Para cada carga de parte, debe anotar el número de parte y el valor de ETag. Debe incluir estos valores en la solicitud posterior para completar la carga multiparte. Cada parte tendrá su propia ETag en el momento de la carga. No obstante, una vez que se completa la carga multiparte y se consolidan todas las partes, todas las partes pertenecen a una ETag como una suma de comprobación de sumas de comprobación.

**importante**  
Después de iniciar una carga multiparte y cargar una o más partes, debe completar o parar la carga multiparte para que no le cobren por el almacenamiento de las partes cargadas. Solo *después* de completar o detener una carga multiparte, Amazon S3 liberará el almacenamiento de las partes y detendrá el cobro del almacenamiento de partes.  
Después de detener una carga multiparte, no puede volver a cargar ninguna parte con ese ID de carga. Si las cargas de partes estuvieran en curso, todavía se pueden ejecutar correctamente o producir un error una vez detenidas. Para asegurarse de que se libera todo el espacio de almacenamiento consumido por las partes, debe parar una carga multiparte solo después de haber completado las cargas de todas las partes.

**Finalización de la carga multiparte**  
Al completar una carga multiparte, Amazon S3 crea un objeto al concatenar las partes en orden ascendente según el número de parte. Si se proporcionaron los metadatos de algún objeto en la solicitud *inicio de carga multiparte*, Amazon S3 asocia estos metadatos al objeto. Después de una solicitud de *completar* realizada correctamente, las partes ya no existirán. 

La solicitud de *carga multiparte completa* debe incluir el ID de carga y una lista de ambos números de parte y los valores de ETag correspondientes. La respuesta de Amazon S3 incluye una ETag que identifica de forma exclusiva los datos de objetos combinados. Esta ETag no es necesariamente un hash de MD5 de los datos del objeto.

Cuando proporciona una suma de comprobación de objeto completa durante una carga multiparte, el SDK de AWS pasa la suma de comprobación a Amazon S3 y S3 valida la integridad del objeto en el servidor y lo compara con el valor recibido. A continuación, S3 almacena el objeto si los valores coinciden. Si los dos valores no coinciden, Amazon S3 no realiza la solicitud y genera el error `BadDigest`. La suma de comprobación del objeto también se almacena en los metadatos del objeto que utilizará más adelante para validar la integridad de los datos de un objeto. 

**Ejemplo de llamadas de carga multiparte**  
 En este ejemplo, suponga que está generando una carga multiparte para un archivo de 100 GB. En tal caso tendría las siguientes llamadas a la API para todo el proceso. Habría un total de 1002 llamadas a la API. 
+ Una llamada `[CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)` para iniciar el proceso.
+ 1000 llamadas `[UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)` individuales y cada una carga una parte de 100 MB, con un tamaño total de 100 GB.
+ Una llamada `[CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)` para completar el proceso.

**Listas de cargas multiparte**  
Puede enumerar las partes de una carga multiparte específica o todas las cargas multipartes en curso. La operación de enumeración de partes devuelve la información de las partes que ha cargado para una carga multiparte específica. Para cada solicitud de lista de partes, Amazon S3 devuelve la información de las partes para la carga multiparte específica, hasta un máximo de 1000 partes. Si hay más de 1000 partes en la carga multiparte, debe enviar una serie de solicitudes de lista de partes para recuperar todas las partes. Tenga en cuenta que la lista de partes que se devuelve no incluye las partes que no hayan terminado de cargarse. Con la operación *lista de cargas multiparte*, 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. Cada solicitud devuelve 1 000 cargas multipartes como máximo. Si hay más de 1 000 cargas multiparte en curso, debe enviar otras solicitudes para recuperar las cargas multiparte restantes. Solo utilice la lista devuelta para fines de verificación.

**importante**  
No utilice el resultado de esta lista al enviar una solicitud para *completar la carga multiparte*. En cambio, mantenga su propia lista de números de parte que especificó al cargarlas y los valores correspondientes de ETag que devuelve Amazon S3.

## Sumas de comprobación con operaciones de carga multiparte
<a name="mpuchecksums"></a>

Al cargar un objeto en Amazon S3, puede especificar un algoritmo de suma de comprobación para que lo utilice Amazon S3. De forma predeterminada, el SDK de AWS y la consola de S3 utilizan un algoritmo para todas las cargas de objetos, que puede anular. Si utiliza un SDK más antiguo y el objeto cargado no tiene una suma de comprobación especificada, Amazon S3 utiliza automáticamente el algoritmo de suma de comprobación CRC-64/NVME (`CRC64NVME`). (Esta también es la opción recomendada para una verificación eficiente de la integridad de los datos). Cuando se utiliza CRC-64/NVME, Amazon S3 calcula la suma de comprobación del objeto completo después de que se complete la carga multiparte o de una sola parte. El algoritmo de suma de comprobación CRC-64/NVME se utiliza para calcular una suma de comprobación directa de todo el objeto o una suma de comprobación de las sumas de comprobación de cada parte individual.

Después de cargar un objeto en S3 mediante la carga multiparte, Amazon S3 calcula el valor de suma de comprobación para cada parte, o para el objeto completo, y almacena los valores. Puede utilizar la API de S3 o el SDK de AWS para recuperar el valor de la suma de comprobación de las siguientes maneras:
+ Para partes individuales, puede utilizar [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) o [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html). Si quiere recuperar los valores de la suma de comprobación de partes individuales de las cargas multiparte mientras aún están en proceso, puede utilizar [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html).
+ Para todo el objeto, puede utilizar [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html). Si desea realizar una carga multiparte con una suma de comprobación de objeto completo, utilice [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload) y [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload); para ello, especifique el tipo de suma de comprobación de objeto completo. Para validar el valor de suma de comprobación del objeto completo o para confirmar qué tipo de suma de comprobación se está utilizando en la carga multiparte, utilice [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html).

**importante**  
Si utiliza una carga multiparte con **Sumas de comprobación**, los números de parte de cada carga de parte (en la carga multiparte) deben utilizar números de parte consecutivos y comenzar por 1. Al utilizar **Sumas de comprobación**, si intenta completar una solicitud de carga multiparte con números de parte no consecutivos, Amazon S3 genera un error `HTTP 500 Internal Server`.

 Para obtener más información sobre cómo funcionan las sumas de comprobación con objetos de carga multiparte, consulte [Comprobación de la integridad de objetos en Amazon S3](checking-object-integrity.md).

Para ver un procedimiento completo que muestra cómo cargar un objeto mediante la carga multiparte con una suma de comprobación adicional, consulte [Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos](tutorial-s3-mpu-additional-checksums.md).

## Operaciones de carga multiparte simultáneas
<a name="distributedmpupload"></a>

En un entorno de desarrollo distribuido, es posible que la aplicación inicie varias actualizaciones en el mismo objeto simultáneamente. La aplicación puede iniciar varias cargas multipartes con la misma clave de objeto. Para cada una de estas cargas, la aplicación puede cargar las partes y enviar una solicitud de carga completa a Amazon S3 para crear el objeto. Cuando los buckets tienen el control de versiones de S3 habilitado, siempre se creará una nueva versión cuando se complete una carga multiparte. Al iniciar varias cargas multiparte que utilizan la misma clave de objeto en un bucket con el control de versiones habilitado, la versión actual del objeto viene determinada por la carga que se haya iniciado más recientemente (`createdDate`).

Por ejemplo, inicia una solicitud `CreateMultipartUpload` para un objeto a las 10:00 h. A continuación, envía una segunda solicitud `CreateMultipartUpload` para el mismo objeto a las 11:00 h. Como la segunda solicitud se envió más recientemente, el objeto cargado por la solicitud de las 11:00 h es la versión actual, incluso si la primera carga se completa después de la segunda. Para los buckets que no tienen habilitado el control de versiones, es posible que cualquier otra solicitud recibida entre el momento en que se inicia la carga multiparte y cuando se completa, la otra solicitud pueda tener prioridad.

Otro ejemplo de cuándo una solicitud de carga multiparte simultánea puede tener prioridad es si otra operación elimina una clave después de que inicie una carga multiparte con esa clave. Antes de completar la operación, la respuesta de carga multiparte completa podría indicar una creación correcta del objeto sin que vea el objeto. 

## Impedimento para que se carguen objetos con nombres de claves idénticos durante la carga multiparte
<a name="multipart-upload-objects-with-same-key-name"></a>

Puede comprobar la existencia de un objeto en el bucket antes de crearlo mediante una operación condicional de escritura al cargar. Esto puede evitar que se sobrescriban los datos existentes. Las escrituras condicionales validarán que no haya ningún objeto existente con el mismo nombre de clave en el bucket al realizar la carga.

Puede usar escrituras condicionales para las solicitudes de [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) o [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html).

Para obtener más información sobre las solicitudes condicionales, consulte [Agregación de condiciones previas a operaciones de S3 con solicitudes condicionales](conditional-requests.md).

## Carga multiparte y precios
<a name="mpuploadpricing"></a>

Después de iniciar una carga multiparte, Amazon S3 retiene todas las partes hasta que complete o detenga la carga. Durante la vida útil, se le cobrará por todo el almacenamiento, el ancho de banda y las solicitudes para esta carga multiparte y sus partes asociadas. 

Estas partes se facturan según la clase de almacenamiento especificada cuando se cargaron las partes. No obstante, no se le facturarán estas partes si se cargan en S3 Glacier Flexible Retrieval o S3 Glacier Deep Archive. Las partes multiparte en curso para la solicitud PUT a la clase de almacenamiento S3 Glacier Flexible Retrieval se facturan como almacenamiento provisional S3 Glacier Flexible Retrieval a las tarifas de almacenamiento de S3 Standard hasta que se complete la carga. Además, `CreateMultipartUpload` y `UploadPart` se facturan según las tarifas de S3 Standard. Solo la solicitud `CompleteMultipartUpload` se factura con la tarifa de S3 Glacier Flexible Retrieval. Del mismo modo, las partes multiparte en curso para PUT a la clase de almacenamiento S3 Glacier Deep Archive se facturan como almacenamiento provisional S3 Glacier Flexible Retrieval a las tarifas de almacenamiento de S3 Standard hasta que se complete la carga, con solo la solicitud `CompleteMultipartUpload` cobrada según las tarifas de S3 Glacier Deep Archive.

Si detiene la carga multiparte, Amazon S3 elimina los artefactos cargados y todas las partes que haya cargado. No se le facturarán esos artefactos. No se cobran gastos de eliminación anticipada por eliminar cargas multiparte incompletas, independientemente de la clase de almacenamiento especificada. Para obtener más información acerca de los precios, consulte [Precios de Amazon S3](https://aws.amazon.com/s3/pricing/).

**nota**  
Para reducir los costos de almacenamiento, se recomienda configurar una regla del ciclo de vida para eliminar las cargas multiparte incompletas al cabo de un número específico de días mediante la acción `AbortIncompleteMultipartUpload`. Para obtener más información sobre cómo crear una regla de ciclo de vida para eliminar las cargas multiparte incompletas, consulte [Configuración de una política de ciclo de vida del bucket para eliminar cargas multiparte incompletas](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html).

## Compatibilidad de la API con las cargas multiparte
<a name="apisupportformpu"></a>

Las siguientes secciones de la *referencia de API de Amazon Simple Storage Service* describen la API de REST para la carga multiparte. 

Para ver un tutorial de carga de varias partes donde se utilicen funciones de AWS Lambda, consulte [Uploading large objects to Amazon S3 using multipart upload and transfer acceleration](https://aws.amazon.com/blogs/compute/uploading-large-objects-to-amazon-s3-using-multipart-upload-and-transfer-acceleration/).
+ [Crear carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [Upload Part](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [Upload Part (Copy)](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [Finalización de una carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [Abort Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html)
+ [List Parts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)
+ [List Multipart Uploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html)

## AWS Command Line InterfaceCompatibilidad de con cargas multiparte
<a name="clisupportformpu"></a>

En los siguientes temas de AWS Command Line Interface, se describen las operaciones para la carga multiparte. 
+ [Initiate Multipart Upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html)
+ [Upload Part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ [Upload Part (Copy)](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ [Finalización de una carga multiparte](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
+ [Abort Multipart Upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
+ [List Parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
+ [List Multipart Uploads](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html)

## AWSCompatibilidad de  SDK con cargas multiparte
<a name="sdksupportformpu"></a>



Puede utilizar un SDK de AWS para cargar un objeto en partes. Para obtener una lista de los SDK de AWS compatibles con la acción de la API, consulte:
+ [Crear carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [Upload Part](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [Upload Part (Copy)](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [Finalización de una carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [Abort Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html)
+ [List Parts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)
+ [List Multipart Uploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html)

## API y permisos de carga multiparte
<a name="mpuAndPermissions"></a>

Debe tener los permisos necesarios para utilizar las operaciones de carga multiparte. Puede utilizar listas de control de acceso (ACL), la política de bucket o la política de usuario para conceder permisos para realizar estas operaciones. En la siguiente tabla se muestran los permisos requeridos para varias operaciones de carga multiparte al utilizar las ACL, una política de bucket o una política de usuario. 


| Acción | Permisos necesarios | 
| --- | --- | 
|  Crear carga multiparte  |  Debe tener permiso para realizar la acción `s3:PutObject` en un objeto a fin de crear una solicitud de carga multiparte.  El propietario del bucket puede permitir a otros clientes realizar la acción `s3:PutObject`.   | 
|  Initiate Multipart Upload  |  Debe tener permiso para realizar la acción `s3:PutObject` en un objeto para iniciar una carga multiparte.  El propietario del bucket puede permitir a otros clientes realizar la acción `s3:PutObject`.   | 
| Initiator | Elemento contenedor que identifica quién inició la carga multiparte. Si el iniciador es una Cuenta de AWS, este elemento proporcionará la misma información que el elemento Propietario. Si el iniciador es un usuario de IAM, este elemento proporciona el ARN de usuario y el nombre para mostrar. | 
| Upload Part | Debe tener permiso para realizar la acción `s3:PutObject` en un objeto para cargar una parte.  El propietario del bucket debe permitir al iniciador realizar la acción `s3:PutObject` en un objeto para que cargue una parte de ese objeto. | 
| Upload Part (Copy) | Debe tener permiso para realizar la acción `s3:PutObject` en un objeto para cargar una parte. Dado que está cargando una parte de un objeto existente, debe tener permiso para realizar la acción `s3:GetObject` en el objeto de origen.  Para que el iniciador cargue una parte del objeto, el propietario del bucket debe permitir al iniciador realizar la acción `s3:PutObject` en un objeto. | 
| Complete Multipart Upload | Debe tener permiso para realizar la acción `s3:PutObject` en un objeto para completar una carga multiparte.  El propietario del bucket debe permitir al iniciador realizar la acción `s3:PutObject` en un objeto para que complete una carga multiparte para ese objeto. | 
| Detener carga multiparte | Debe tener permiso para realizar la acción `s3:AbortMultipartUpload` para parar una carga multiparte.  De forma predeterminada, el propietario del bucket y el iniciador de la carga multiparte deben tener permiso para realizar esta acción como parte de las políticas de bucket de S3 e IAM. Si el iniciador es un usuario de IAM, la Cuenta de AWS correspondiente a dicho usuario también tendrá permiso para parar esa carga multiparte. Con las políticas de punto de conexión de VPC, el iniciador de la carga multiparte no obtiene automáticamente permiso para realizar la acción `s3:AbortMultipartUpload`. Además de estas opciones predeterminadas, el propietario del bucket puede permitir a otras entidades principales realizar la acción `s3:AbortMultipartUpload` en un objeto. El propietario del bucket puede denegar la posibilidad de realizar la acción `s3:AbortMultipartUpload` a cualquier entidad principal. | 
| List Parts | Debe tener permiso para realizar la acción `s3:ListMultipartUploadParts` para mostrar las partes de una carga multiparte. De forma predeterminada, el propietario del bucket tiene permiso para mostrar las partes de cualquier carga multiparte en el bucket. El iniciador de la carga multiparte tiene permiso para mostrar las partes de la carga multiparte específica. Si el iniciador de la carga multiparte es un usuario de IAM, la Cuenta de AWS que lo controla tiene permiso para mostrar las partes de esa carga.  Además de estas opciones predeterminadas, el propietario del bucket puede permitir a otras entidades principales realizar la acción `s3:ListMultipartUploadParts` en un objeto. El propietario del bucket también puede denegar la posibilidad de realizar la acción `s3:ListMultipartUploadParts` a cualquier entidad principal. | 
| List Multipart Uploads | Debe tener permiso para realizar la acción `s3:ListBucketMultipartUploads` en un bucket para mostrar las cargas multipartes en curso de ese bucket. Además de esta opción predeterminada, el propietario del bucket puede permitir a otras entidades principales realizar la acción `s3:ListBucketMultipartUploads` en el bucket. | 
| AWS KMSPermisos relacionados con el cifrado y descifrado de  |  Para realizar una carga multiparte con cifrado mediante una clave de KMS de AWS Key Management Service (AWS KMS), el solicitante debe tener los siguientes permisos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonS3/latest/userguide/mpuoverview.html)  Estos permisos son necesarios, ya que Amazon S3 debe descifrar y leer datos de las partes de archivos cifrados antes de finalizar la carga multiparte. El permiso `kms:Decrypt` y el cifrado del servidor con claves de cifrado proporcionadas por el cliente también son necesarios para obtener el valor de la suma de comprobación de un objeto. Si no dispone de estos permisos necesarios cuando utiliza la API [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html), el objeto se crea sin un valor de suma de comprobación. Si el usuario o rol de IAM está en la misma Cuenta de AWS que la clave de KMS, valide que tiene permisos tanto en la clave como en las políticas de IAM. Si el usuario o rol de IAM pertenecen a una cuenta distinta de la de la clave de KMS, debe tener los permisos tanto en la política de claves como en el usuario o rol de IAM.  | 
| SSE-C (cifrado del servidor con claves de cifrado proporcionadas por el cliente) | Cuando utilice la API [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html), debe proporcionar el SSE-C (cifrado del servidor con claves de cifrado proporcionadas por el cliente); de lo contrario, el objeto se creará sin una suma de comprobación y no se devolverá ningún valor de suma de comprobación.  | 

Para obtener información acerca de la relación entre los permisos de la Access Control List (ACL, Lista de control de acceso) y los permisos de las políticas de acceso, consulte [Mapeo de permisos de ACL y permisos de política de acceso](acl-overview.md#acl-access-policy-permission-mapping). Para obtener información acerca de los usuarios, los roles y las prácticas recomendadas de IAM, consulte [Identidades (usuarios, grupos de usuarios y roles) de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) en la *Guía del usuario de IAM*.

## Sumas de comprobación con operaciones de carga multiparte
<a name="Checksums-mpu-operations"></a>

Hay tres API de Amazon S3 que se utilizan para realizar la carga multiparte real: [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) y [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html). La siguiente tabla indica qué encabezados y valores de suma de comprobación deben proporcionarse para cada una de las API:


| Algoritmo de suma de comprobación | Tipo de suma de comprobación | `CreateMultipartUpload` | `UploadPart` | `CompleteMultipartUpoad` | 
| --- | --- | --- | --- | --- | 
| CRC-64/NVME (`CRC64NVME`) | Objeto completo | Encabezados obligatorios: `x-amz-checksum-algorithm` |  Encabezados opcionales: `x-amz-checksum-crc64nvme`  |  Encabezados opcionales: `x-amz-checksum-algorithm` `x-amz-crc64`  | 
| CRC-32 (`CRC32`) CRC 32-C (`CRC32C`) | Objeto completo |  Encabezados obligatorios: `x-amz-checksum-algorithm` `x-amz-checksum-type`  |  Encabezados opcionales: `x-amz-checksum-crc64nvme`  |  Encabezados opcionales: `x-amz-checksum-algorithm` `x-amz-crc32` `x-amz-crc32c`  | 
|  CRC-32 (`CRC32`) CRC-32C (`CRC32C`) SHA-1 (`SHA1`) SHA-256 (`SHA256`) | Compuesto |  Encabezados obligatorios: `x-amz-checksum-algorithm`  |  Encabezados obligatorios: `x-amz-checksum-crc32` `x-amz-checksum-crc32c` `x-amz-checksum-sha1` `x-amz-checksum-sha256`  |  Encabezados obligatorios: Todas las sumas de comprobación en el nivel de parte deben incluirse en la solicitud `CompleteMultiPartUpload`. Encabezados opcionales: `x-amz-crc32` `x-amz-crc32c` `x-amz-sha1` `x-amz-sha256`  | 

**Topics**
+ [Proceso de carga multiparte](#mpu-process)
+ [Sumas de comprobación con operaciones de carga multiparte](#mpuchecksums)
+ [Operaciones de carga multiparte simultáneas](#distributedmpupload)
+ [Impedimento para que se carguen objetos con nombres de claves idénticos durante la carga multiparte](#multipart-upload-objects-with-same-key-name)
+ [Carga multiparte y precios](#mpuploadpricing)
+ [Compatibilidad de la API con las cargas multiparte](#apisupportformpu)
+ [AWS Command Line InterfaceCompatibilidad de con cargas multiparte](#clisupportformpu)
+ [AWSCompatibilidad de  SDK con cargas multiparte](#sdksupportformpu)
+ [API y permisos de carga multiparte](#mpuAndPermissions)
+ [Sumas de comprobación con operaciones de carga multiparte](#Checksums-mpu-operations)
+ [Configuración de una política de ciclo de vida del bucket para eliminar cargas multiparte incompletas](mpu-abort-incomplete-mpu-lifecycle-config.md)
+ [Carga de un objeto con la carga multiparte](mpu-upload-object.md)
+ [Carga de un directorio utilizando la clase TransferUtility de .NET de alto nivel](HLuploadDirDotNet.md)
+ [Descripción de cargas multiparte](list-mpu.md)
+ [Seguimiento de una carga multiparte con los AWS SDK](track-mpu.md)
+ [Anulación de la carga multiparte](abort-mpu.md)
+ [Copiar un objeto con la carga multiparte](CopyingObjectsMPUapi.md)
+ [Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos](tutorial-s3-mpu-additional-checksums.md)
+ [Límites de carga multiparte de Amazon S3](qfacts.md)

# Configuración de una política de ciclo de vida del bucket para eliminar cargas multiparte incompletas
<a name="mpu-abort-incomplete-mpu-lifecycle-config"></a>

Como práctica recomendada, configure una regla de ciclo de vida con la acción `AbortIncompleteMultipartUpload` para reducir los costos de almacenamiento. Para obtener más información sobre cómo anular una carga de varias partes, consulte [Anulación de la carga multiparte](abort-mpu.md).

Amazon S3 admite una regla de ciclo de vida del bucket que puede utilizar para que Amazon S3 pare las cargas multiparte que no están completas dentro de un número especificado de días después de iniciarse. Cuando una carga multiparte no se completa en el plazo especificado, pasa a ser apta para una operación de cancelación. Cuando Amazon S3 detiene una carga multiparte y elimina todas las partes asociadas con la carga multiparte. Esta regla se aplica tanto a las cargas multiparte existentes como a las que cree más adelante.

 El siguiente es un ejemplo de configuración de ciclo de vida que especifica una regla con la acción `AbortIncompleteMultipartUpload`. 

```
<LifecycleConfiguration>
    <Rule>
        <ID>sample-rule</ID>
        <Prefix></Prefix>
        <Status>Enabled</Status>
        <AbortIncompleteMultipartUpload>
          <DaysAfterInitiation>7</DaysAfterInitiation>
        </AbortIncompleteMultipartUpload>
    </Rule>
</LifecycleConfiguration>
```

En el ejemplo, la regla no especifica un valor para el elemento `Prefix` (el [prefijo de nombre de clave de objeto](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)). Por lo tanto, la regla se aplica a todos los objetos del bucket para los que se han iniciado cargas multiparte. Las cargas multiparte que se iniciaron y no se completaron en siete días son aptas para una operación de anulación. La acción de anulación no afecta a las cargas multiparte completadas.

Para obtener más información acerca de la configuración del ciclo de vida del bucket, consulte [Administración del ciclo de vida de los objetos](object-lifecycle-mgmt.md).

**nota**  
Si la carga multiparte se completa dentro de un periodo especificado de días en la regla, la acción de ciclo de vida `AbortIncompleteMultipartUpload` no aplica (es decir, Amazon S3 no realizará acciones). Además, esta acción no aplica a los objetos. Esta acción de ciclo de vida no elimina objetos. Además, no se te cobrará por la eliminación anticipada de S3 Lifecycle si eliminas cualquier parte de carga multiparte incompleta.

## Uso de la consola de S3
<a name="mpu-abort-incomplete-mpu-lifecycle-config-console"></a>

Para administrar automáticamente las cargas multiparte incompletas, puede usar la consola de S3 para crear una regla de ciclo de vida para hacer vencer bytes de carga multiparte incompletos del bucket después de un número especificado de días. En el procedimiento siguiente se muestra cómo agregar una regla del ciclo de vida para eliminar cargas multiparte incompletas después de 7 días. Para obtener más información sobre cómo agregar reglas del ciclo de vida, consulte [Establecimiento de una configuración de S3 Lifecycle en un bucket](how-to-set-lifecycle-configuration-intro.md).

**Para agregar una regla del ciclo de vida para cancelar las cargas multiparte incompletas que tengan más de 7 días**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon S3 en [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. En la lista **Buckets**, seleccione el nombre del bucket para el que desea crear una regla de ciclo de vida.

1. Seleccione la pestaña **Management (Administración)** y seleccione **Create lifecycle rule (Crear regla de ciclo de vida)**.

1. En **Lifecycle rule name (Nombre de regla de ciclo de vida)**, escriba un nombre para la regla.

   El nombre debe ser único dentro del bucket. 

1. Elija el ámbito de la regla de ciclo de vida:
   + Para crear una regla del ciclo de vida para todos los objetos con un prefijo específico, elija **Limit the scope of this rule using one or more filters** (Limitar el alcance de esta regla mediante uno o varios filtros) e ingrese el prefijo en el campo **Prefix** (Prefijo).
   + Para crear una regla de ciclo de vida para todos los objetos del bucket, elija **This rule applies to **all** objects in the bucket** (Esta regla se aplica a todos los objetos del bucket) y elija **I acknowledge that this rule applies to all objects in the bucket** (Reconozco que esta regla se aplica a todos los objetos del bucket).

1. En **Lifecycle rule actions** (Acciones de reglas del ciclo de vida), seleccione **Delete expired object delete markers or incomplete multipart uploads** (Eliminar marcadores de eliminación de objetos vencidos o cargas multiparte incompletas).

1. En **Delete expired object delete markers or incomplete multipart uploads** (Eliminar marcadores de eliminación de objetos vencidos o cargas multiparte incompletas), seleccione **Delete incomplete multipart uploads** (Eliminar cargas multiparte incompletas).

1. En el campo **Number of days** (Número de días), ingrese el número de días transcurridos después de eliminar cargas multiparte incompletas (por ejemplo, 7 días). 

1. Seleccione **Creación de regla**.

## Uso de AWS CLI
<a name="mpu-abort-incomplete-mpu-lifecycle-config-cli"></a>

El siguiente comando `put-bucket-lifecycle-configuration` de la AWS Command Line Interface (AWS CLI) agrega la configuración del ciclo de vida para el bucket especificado. Para usar este comando, sustituya `user input placeholders` por la información.

```
aws s3api put-bucket-lifecycle-configuration  \
        --bucket amzn-s3-demo-bucket  \
        --lifecycle-configuration filename-containing-lifecycle-configuration
```

El siguiente ejemplo muestra cómo agregar una regla del ciclo de vida para anular las cargas multiparte incompletas mediante la AWS CLI. Incluye una configuración del ciclo de vida de JSON de ejemplo para anular las cargas multiparte incompletas que tengan más de 7 días de antigüedad.

Para usar los comandos de la CLI de este ejemplo, sustituya `user input placeholders` por la información.

**Para agregar una regla del ciclo de vida para cancelar las cargas multiparte incompletas**

1. Cómo configurar la AWS CLI. Para obtener instrucciones, consulte [Developing with Amazon S3 using the AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html) en la *Amazon S3 API Reference*. 

1. Guarde la configuración del ciclo de vida de ejemplo siguiente en un archivo (por ejemplo, *`lifecycle.json`*``). La configuración de ejemplo especifica un prefijo vacío y, por lo tanto, se aplica a todos los objetos del bucket. Para restringir la configuración a un subconjunto de objetos, puede especificar un prefijo.

   ```
   {
       "Rules": [
           {
               "ID": "Test Rule",
               "Status": "Enabled",
               "Filter": {
                   "Prefix": ""
               },
               "AbortIncompleteMultipartUpload": {
                   "DaysAfterInitiation": 7
               }
           }
       ]
   }
   ```

1.  Ejecute el siguiente comando de la CLI para establecer esta configuración del ciclo de vida en el bucket. 

   ```
   aws s3api put-bucket-lifecycle-configuration   \
   --bucket amzn-s3-demo-bucket  \
   --lifecycle-configuration file://lifecycle.json
   ```

1.  Para comprobar que la configuración del ciclo de vida se ha establecido en el bucket, recupere la configuración del ciclo de vida mediante el siguiente comando `get-bucket-lifecycle`. 

   ```
   aws s3api get-bucket-lifecycle  \
   --bucket amzn-s3-demo-bucket
   ```

1.  Para eliminar la configuración del ciclo de vida, utilice el comando `delete-bucket-lifecycle` siguiente. 

   ```
   aws s3api delete-bucket-lifecycle \
   --bucket amzn-s3-demo-bucket
   ```

# Carga de un objeto con la carga multiparte
<a name="mpu-upload-object"></a>

Puede utilizar la carga multiparte para cargar mediante programación un solo objeto en Amazon S3. Cada objeto se carga como un conjunto de partes. Cada parte es una parte contigua de los datos del objeto. Puede cargar estas partes del objeto de forma independiente y en cualquier orden. Si la transmisión de cualquier parte falla, puede retransmitir esta parte sin que las demás partes se vean afectadas. Después de cargar todas las partes del objeto, Amazon S3 las combina y crea el objeto. Los usuarios anónimos no pueden iniciar cargas multiparte.

Para conocer un procedimiento integral sobre la carga de un objeto con carga multiparte con una suma de comprobación adicional, consulte [Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos](tutorial-s3-mpu-additional-checksums.md).

En la siguiente sección, se muestra cómo utilizar la carga multiparte con la AWS Command Line Interface y AWS SDK.

## Uso de la consola de S3
<a name="MultipartUploadConsole"></a>

Puede cargar cualquier tipo de archivo, como imágenes, copias de seguridad, datos, películas, etc., en un bucket de S3. El tamaño máximo de un archivo que puede cargar con la consola de Amazon S3 es de 160 GB. Para cargar un archivo que sobrepase los 160 GB de tamaño, utilice la AWS Command Line Interface (AWS CLI), el SDK de AWS o la API de REST de Amazon S3.

Para obtener instrucciones sobre la carga de un objeto a través de Consola de administración de AWS, consulte [Carga de objetos](upload-objects.md).

## Mediante AWS CLI
<a name="UsingCLImpUpload"></a>

A continuación, se describen las operaciones de Amazon S3 para la carga multiparte utilizando la AWS CLI. 
+ [Initiate Multipart Upload](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-multipart-upload.html)
+ [Upload Part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ [Upload Part (Copy)](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ [Finalización de una carga multiparte](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
+ [Abort Multipart Upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
+ [List Parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
+ [List Multipart Uploads](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html)

## Uso de la API de REST
<a name="UsingRESTAPImpUpload"></a>

En las siguientes secciones de la *referencia de la API de Amazon Simple Storage Service*, se describe la API de REST para la carga multiparte. 
+ [Initiate Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Upload Part](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Finalización de una carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Detener carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html)
+ [List Parts](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html)
+ [List Multipart Uploads](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html)

## Uso de los SDK de AWS (API de alto nivel)
<a name="multipart-upload-high-level"></a>

Algunos SDK de AWS incluyen una API de alto nivel que simplifica la carga de varias partes al combinar las diferentes operaciones de la API necesarias para completar una carga de varias partes en una sola operación. Para obtener más información, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md). 

Si tiene que detenerse y reanudar cargas de varias partes, variar los tamaños de las partes durante la carga, o si no conoce de antemano el tamaño de los datos, use la API de bajo nivel. Para obtener más información sobre los métodos de la API de bajo nivel para cargas de varias partes que ofrecen funcionalidad adicional, consulte [Uso de los SDK de AWS (API de bajo nivel)](#mpu-upload-low-level). 

------
#### [ Java ]

Para ver ejemplos de cómo realizar una carga multiparte con el AWS SDK para Java, consulte [Upload or download large files to and from Amazon S3 using an AWS SDK](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_UsingLargeFiles_section.html) en la *Referencia de la API de Amazon S3*.

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

Para cargar un archivo a un bucket de S3, utilice la clase `TransferUtility`. Al cargar los datos de un archivo, debe proporcionar el nombre de clave del objeto. Si no lo hace, la API utiliza el nombre del archivo como nombre de clave. Al cargar los datos de una secuencia, debe proporcionar el nombre de clave del objeto.

Para configurar opciones de carga avanzadas, como el tamaño de la parte, el número de subprocesos al cargar las partes simultáneamente, los metadatos, la clase de almacenamiento o la ACL, utilice la clase `TransferUtilityUploadRequest`. 

**nota**  
Cuando se utiliza una secuencia para el origen de datos, la clase `TransferUtility` no realiza cargas simultáneas. 

En el siguiente ejemplo de código C\$1 se carga un archivo en un bucket de Amazon S3 en varias partes. Muestra cómo utilizar varias sobrecargas `TransferUtility.Upload` para cargar un archivo. Cada llamada sucesiva de carga reemplaza la carga anterior. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .NET*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class UploadFileMPUHighLevelAPITest
    {
        private const string bucketName = "*** provide bucket name ***";
        private const string keyName = "*** provide a name for the uploaded object ***";
        private const string filePath = "*** provide the full path name of the file to upload ***";
        // 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);
            UploadFileAsync().Wait();
        }

        private static async Task UploadFileAsync()
        {
            try
            {
                var fileTransferUtility =
                    new TransferUtility(s3Client);

                // Option 1. Upload a file. The file name is used as the object key name.
                await fileTransferUtility.UploadAsync(filePath, bucketName);
                Console.WriteLine("Upload 1 completed");

                // Option 2. Specify object key name explicitly.
                await fileTransferUtility.UploadAsync(filePath, bucketName, keyName);
                Console.WriteLine("Upload 2 completed");

                // Option 3. Upload data from a type of System.IO.Stream.
                using (var fileToUpload = 
                    new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    await fileTransferUtility.UploadAsync(fileToUpload,
                                               bucketName, keyName);
                }
                Console.WriteLine("Upload 3 completed");

                // Option 4. Specify advanced settings.
                var fileTransferUtilityRequest = new TransferUtilityUploadRequest
                {
                    BucketName = bucketName,
                    FilePath = filePath,
                    StorageClass = S3StorageClass.StandardInfrequentAccess,
                    PartSize = 6291456, // 6 MB.
                    Key = keyName,
                    CannedACL = S3CannedACL.PublicRead
                };
                fileTransferUtilityRequest.Metadata.Add("param1", "Value1");
                fileTransferUtilityRequest.Metadata.Add("param2", "Value2");

                await fileTransferUtility.UploadAsync(fileTransferUtilityRequest);
                Console.WriteLine("Upload 4 completed");
            }
            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);
            }

        }
    }
}
```

------
#### [ JavaScript ]

**Example**  
Cargue un archivo grande.  

```
import { S3Client } from "@aws-sdk/client-s3";
import { Upload } from "@aws-sdk/lib-storage";

import {
  ProgressBar,
  logger,
} from "@aws-doc-sdk-examples/lib/utils/util-log.js";

const twentyFiveMB = 25 * 1024 * 1024;

export const createString = (size = twentyFiveMB) => {
  return "x".repeat(size);
};

/**
 * Create a 25MB file and upload it in parts to the specified
 * Amazon S3 bucket.
 * @param {{ bucketName: string, key: string }}
 */
export const main = async ({ bucketName, key }) => {
  const str = createString();
  const buffer = Buffer.from(str, "utf8");
  const progressBar = new ProgressBar({
    description: `Uploading "${key}" to "${bucketName}"`,
    barLength: 30,
  });

  try {
    const upload = new Upload({
      client: new S3Client({}),
      params: {
        Bucket: bucketName,
        Key: key,
        Body: buffer,
      },
    });

    upload.on("httpUploadProgress", ({ loaded, total }) => {
      progressBar.update({ current: loaded, total });
    });

    await upload.done();
  } catch (caught) {
    if (caught instanceof Error && caught.name === "AbortError") {
      logger.error(`Multipart upload was aborted. ${caught.message}`);
    } else {
      throw caught;
    }
  }
};
```

**Example**  
Descargue un archivo grande.  

```
import { fileURLToPath } from "node:url";
import { GetObjectCommand, NoSuchKey, S3Client } from "@aws-sdk/client-s3";
import { createWriteStream, rmSync } from "node:fs";

const s3Client = new S3Client({});
const oneMB = 1024 * 1024;

export const getObjectRange = ({ bucket, key, start, end }) => {
  const command = new GetObjectCommand({
    Bucket: bucket,
    Key: key,
    Range: `bytes=${start}-${end}`,
  });

  return s3Client.send(command);
};

/**
 * @param {string | undefined} contentRange
 */
export const getRangeAndLength = (contentRange) => {
  const [range, length] = contentRange.split("/");
  const [start, end] = range.split("-");
  return {
    start: Number.parseInt(start),
    end: Number.parseInt(end),
    length: Number.parseInt(length),
  };
};

export const isComplete = ({ end, length }) => end === length - 1;

const downloadInChunks = async ({ bucket, key }) => {
  const writeStream = createWriteStream(
    fileURLToPath(new URL(`./${key}`, import.meta.url)),
  ).on("error", (err) => console.error(err));

  let rangeAndLength = { start: -1, end: -1, length: -1 };

  while (!isComplete(rangeAndLength)) {
    const { end } = rangeAndLength;
    const nextRange = { start: end + 1, end: end + oneMB };

    const { ContentRange, Body } = await getObjectRange({
      bucket,
      key,
      ...nextRange,
    });
    console.log(`Downloaded bytes ${nextRange.start} to ${nextRange.end}`);

    writeStream.write(await Body.transformToByteArray());
    rangeAndLength = getRangeAndLength(ContentRange);
  }
};

/**
 * Download a large object from and Amazon S3 bucket.
 *
 * When downloading a large file, you might want to break it down into
 * smaller pieces. Amazon S3 accepts a Range header to specify the start
 * and end of the byte range to be downloaded.
 *
 * @param {{ bucketName: string, key: string }}
 */
export const main = async ({ bucketName, key }) => {
  try {
    await downloadInChunks({
      bucket: bucketName,
      key: key,
    });
  } catch (caught) {
    if (caught instanceof NoSuchKey) {
      console.error(`Failed to download object. No such key "${key}".`);
      rmSync(key);
    }
  }
};
```

------
#### [ Go ]

Para obtener más información sobre el código Go de ejemplo para la carga multiparte, consulte [Carga o descarga de archivos grandes desde y hacia Amazon S3 con un AWS SDK](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_UsingLargeFiles_section.html).

**Example**  
Cargue un objeto grande mediante un mánager de carga para dividir los datos en partes y cargarlos simultáneamente.  

```
import (
	"bytes"
	"context"
	"errors"
	"fmt"
	"io"
	"log"
	"os"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/service/s3/types"
	"github.com/aws/smithy-go"
)

// BucketBasics encapsulates the Amazon Simple Storage Service (Amazon S3) actions
// used in the examples.
// It contains S3Client, an Amazon S3 service client that is used to perform bucket
// and object actions.
type BucketBasics struct {
	S3Client *s3.Client
}
```

```
// UploadLargeObject uses an upload manager to upload data to an object in a bucket.
// The upload manager breaks large data into parts and uploads the parts concurrently.
func (basics BucketBasics) UploadLargeObject(ctx context.Context, bucketName string, objectKey string, largeObject []byte) error {
	largeBuffer := bytes.NewReader(largeObject)
	var partMiBs int64 = 10
	uploader := manager.NewUploader(basics.S3Client, func(u *manager.Uploader) {
		u.PartSize = partMiBs * 1024 * 1024
	})
	_, err := uploader.Upload(ctx, &s3.PutObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectKey),
		Body:   largeBuffer,
	})
	if err != nil {
		var apiErr smithy.APIError
		if errors.As(err, &apiErr) && apiErr.ErrorCode() == "EntityTooLarge" {
			log.Printf("Error while uploading object to %s. The object is too large.\n"+
				"The maximum size for a multipart upload is 5TB.", bucketName)
		} else {
			log.Printf("Couldn't upload large object to %v:%v. Here's why: %v\n",
				bucketName, objectKey, err)
		}
	} else {
		err = s3.NewObjectExistsWaiter(basics.S3Client).Wait(
			ctx, &s3.HeadObjectInput{Bucket: aws.String(bucketName), Key: aws.String(objectKey)}, time.Minute)
		if err != nil {
			log.Printf("Failed attempt to wait for object %s to exist.\n", objectKey)
		}
	}

	return err
}
```

**Example**  
Descargue un objeto grande mediante un mánager de descargas para obtener los datos en partes y descargarlos simultáneamente.  

```
// DownloadLargeObject uses a download manager to download an object from a bucket.
// The download manager gets the data in parts and writes them to a buffer until all of
// the data has been downloaded.
func (basics BucketBasics) DownloadLargeObject(ctx context.Context, bucketName string, objectKey string) ([]byte, error) {
	var partMiBs int64 = 10
	downloader := manager.NewDownloader(basics.S3Client, func(d *manager.Downloader) {
		d.PartSize = partMiBs * 1024 * 1024
	})
	buffer := manager.NewWriteAtBuffer([]byte{})
	_, err := downloader.Download(ctx, buffer, &s3.GetObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectKey),
	})
	if err != nil {
		log.Printf("Couldn't download large object from %v:%v. Here's why: %v\n",
			bucketName, objectKey, err)
	}
	return buffer.Bytes(), err
}
```

------
#### [ PHP ]

Este tema explica cómo usar la clase `Aws\S3\Model\MultipartUpload\UploadBuilder` de alto nivel de AWS SDK para PHP para cargas de archivos multiparte. Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte [SDK de AWS para Ruby, versión 2](https://docs.aws.amazon.com/sdkforruby/api/index.html).

En el siguiente ejemplo de PHP se carga un archivo a un bucket de Amazon S3. El ejemplo muestra cómo configurar parámetros para el objeto `MultipartUploader`. 

```
 require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Prepare the upload parameters.
$uploader = new MultipartUploader($s3, '/path/to/large/file.zip', [
    'bucket' => $bucket,
    'key'    => $keyname
]);

// Perform the upload.
try {
    $result = $uploader->upload();
    echo "Upload complete: {$result['ObjectURL']}" . PHP_EOL;
} catch (MultipartUploadException $e) {
    echo $e->getMessage() . PHP_EOL;
}
```

------
#### [ Python ]

En el siguiente ejemplo se carga un objeto con la API Python de carga multiparte de alto nivel (la clase `TransferManager`). 

```
import sys
import threading

import boto3
from boto3.s3.transfer import TransferConfig


MB = 1024 * 1024
s3 = boto3.resource("s3")


class TransferCallback:
    """
    Handle callbacks from the transfer manager.

    The transfer manager periodically calls the __call__ method throughout
    the upload and download process so that it can take action, such as
    displaying progress to the user and collecting data about the transfer.
    """

    def __init__(self, target_size):
        self._target_size = target_size
        self._total_transferred = 0
        self._lock = threading.Lock()
        self.thread_info = {}

    def __call__(self, bytes_transferred):
        """
        The callback method that is called by the transfer manager.

        Display progress during file transfer and collect per-thread transfer
        data. This method can be called by multiple threads, so shared instance
        data is protected by a thread lock.
        """
        thread = threading.current_thread()
        with self._lock:
            self._total_transferred += bytes_transferred
            if thread.ident not in self.thread_info.keys():
                self.thread_info[thread.ident] = bytes_transferred
            else:
                self.thread_info[thread.ident] += bytes_transferred

            target = self._target_size * MB
            sys.stdout.write(
                f"\r{self._total_transferred} of {target} transferred "
                f"({(self._total_transferred / target) * 100:.2f}%)."
            )
            sys.stdout.flush()


def upload_with_default_configuration(
    local_file_path, bucket_name, object_key, file_size_mb
):
    """
    Upload a file from a local folder to an Amazon S3 bucket, using the default
    configuration.
    """
    transfer_callback = TransferCallback(file_size_mb)
    s3.Bucket(bucket_name).upload_file(
        local_file_path, object_key, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def upload_with_chunksize_and_meta(
    local_file_path, bucket_name, object_key, file_size_mb, metadata=None
):
    """
    Upload a file from a local folder to an Amazon S3 bucket, setting a
    multipart chunk size and adding metadata to the Amazon S3 object.

    The multipart chunk size controls the size of the chunks of data that are
    sent in the request. A smaller chunk size typically results in the transfer
    manager using more threads for the upload.

    The metadata is a set of key-value pairs that are stored with the object
    in Amazon S3.
    """
    transfer_callback = TransferCallback(file_size_mb)

    config = TransferConfig(multipart_chunksize=1 * MB)
    extra_args = {"Metadata": metadata} if metadata else None
    s3.Bucket(bucket_name).upload_file(
        local_file_path,
        object_key,
        Config=config,
        ExtraArgs=extra_args,
        Callback=transfer_callback,
    )
    return transfer_callback.thread_info


def upload_with_high_threshold(local_file_path, bucket_name, object_key, file_size_mb):
    """
    Upload a file from a local folder to an Amazon S3 bucket, setting a
    multipart threshold larger than the size of the file.

    Setting a multipart threshold larger than the size of the file results
    in the transfer manager sending the file as a standard upload instead of
    a multipart upload.
    """
    transfer_callback = TransferCallback(file_size_mb)
    config = TransferConfig(multipart_threshold=file_size_mb * 2 * MB)
    s3.Bucket(bucket_name).upload_file(
        local_file_path, object_key, Config=config, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def upload_with_sse(
    local_file_path, bucket_name, object_key, file_size_mb, sse_key=None
):
    """
    Upload a file from a local folder to an Amazon S3 bucket, adding server-side
    encryption with customer-provided encryption keys to the object.

    When this kind of encryption is specified, Amazon S3 encrypts the object
    at rest and allows downloads only when the expected encryption key is
    provided in the download request.
    """
    transfer_callback = TransferCallback(file_size_mb)
    if sse_key:
        extra_args = {"SSECustomerAlgorithm": "AES256", "SSECustomerKey": sse_key}
    else:
        extra_args = None
    s3.Bucket(bucket_name).upload_file(
        local_file_path, object_key, ExtraArgs=extra_args, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_default_configuration(
    bucket_name, object_key, download_file_path, file_size_mb
):
    """
    Download a file from an Amazon S3 bucket to a local folder, using the
    default configuration.
    """
    transfer_callback = TransferCallback(file_size_mb)
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_single_thread(
    bucket_name, object_key, download_file_path, file_size_mb
):
    """
    Download a file from an Amazon S3 bucket to a local folder, using a
    single thread.
    """
    transfer_callback = TransferCallback(file_size_mb)
    config = TransferConfig(use_threads=False)
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, Config=config, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_high_threshold(
    bucket_name, object_key, download_file_path, file_size_mb
):
    """
    Download a file from an Amazon S3 bucket to a local folder, setting a
    multipart threshold larger than the size of the file.

    Setting a multipart threshold larger than the size of the file results
    in the transfer manager sending the file as a standard download instead
    of a multipart download.
    """
    transfer_callback = TransferCallback(file_size_mb)
    config = TransferConfig(multipart_threshold=file_size_mb * 2 * MB)
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, Config=config, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_sse(
    bucket_name, object_key, download_file_path, file_size_mb, sse_key
):
    """
    Download a file from an Amazon S3 bucket to a local folder, adding a
    customer-provided encryption key to the request.

    When this kind of encryption is specified, Amazon S3 encrypts the object
    at rest and allows downloads only when the expected encryption key is
    provided in the download request.
    """
    transfer_callback = TransferCallback(file_size_mb)

    if sse_key:
        extra_args = {"SSECustomerAlgorithm": "AES256", "SSECustomerKey": sse_key}
    else:
        extra_args = None
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, ExtraArgs=extra_args, Callback=transfer_callback
    )
    return transfer_callback.thread_info
```

------

## Uso de los SDK de AWS (API de bajo nivel)
<a name="mpu-upload-low-level"></a>

El SDK de AWS expone una API de bajo nivel que se parece bastante a la API de REST de Amazon S3 para cargas multiparte (consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md)). Utilice la API de bajo nivel cuando necesite detener y reanudar cargas multiparte, variar los tamaños de las partes durante la carga o si no conoce de antemano el tamaño de los datos de carga. Cuando no tenga estas necesidades, utilice la API de alto nivel (consulte [Uso de los SDK de AWS (API de alto nivel)](#multipart-upload-high-level)).

------
#### [ Java ]

En el siguiente ejemplo se demuestra cómo usar las clases de Java de bajo nivel para cargar un archivo. Realiza los siguientes pasos:
+ Inicia una carga multiparte usando el método `AmazonS3Client.initiateMultipartUpload()` y transmite un objeto `InitiateMultipartUploadRequest`.
+ Guarda el ID de carga que devuelve el método `AmazonS3Client.initiateMultipartUpload()`. Facilite este ID de carga para cada operación de carga multiparte subsiguiente.
+ Carga las partes del objeto. Para cada parte, llame al método `AmazonS3Client.uploadPart()`. La información de carga de partes debe proporcionarse usando un objeto `UploadPartRequest`. 
+ Para cada parte, guarda la ETag desde respuesta del método `AmazonS3Client.uploadPart()` en una lista. Utilice los valores de ETag para completar la carga multiparte.
+ Llama al método `AmazonS3Client.completeMultipartUpload()` para completar la carga multiparte. 

**Example**  
Para obtener instrucciones sobre cómo crear y probar una muestra funcional, consulte [Introducción](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) en la Guía para desarrolladores de AWS SDK para Java.  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class LowLevelMultipartUpload {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String keyName = "*** Key name ***";
        String filePath = "*** Path to file to upload ***";

        File file = new File(filePath);
        long contentLength = file.length();
        long partSize = 5 * 1024 * 1024; // Set part size to 5 MB.

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Create a list of ETag objects. You retrieve ETags for each object part
            // uploaded,
            // then, after each individual part has been uploaded, pass the list of ETags to
            // the request to complete the upload.
            List<PartETag> partETags = new ArrayList<PartETag>();

            // Initiate the multipart upload.
            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, keyName);
            InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest);

            // Upload the file parts.
            long filePosition = 0;
            for (int i = 1; filePosition < contentLength; i++) {
                // Because the last part could be less than 5 MB, adjust the part size as
                // needed.
                partSize = Math.min(partSize, (contentLength - filePosition));

                // Create the request to upload a part.
                UploadPartRequest uploadRequest = new UploadPartRequest()
                        .withBucketName(bucketName)
                        .withKey(keyName)
                        .withUploadId(initResponse.getUploadId())
                        .withPartNumber(i)
                        .withFileOffset(filePosition)
                        .withFile(file)
                        .withPartSize(partSize);

                // Upload the part and add the response's ETag to our list.
                UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest);
                partETags.add(uploadResult.getPartETag());

                filePosition += partSize;
            }

            // Complete the multipart upload.
            CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, keyName,
                    initResponse.getUploadId(), partETags);
            s3Client.completeMultipartUpload(compRequest);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

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

En el siguiente ejemplo de código C\$1 se muestra cómo usar la API de carga multiparte SDK para .NET de bajo nivel para cargar un archivo a un bucket de S3. Para obtener más información sobre cargas multiparte de Amazon S3, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

**nota**  
Cuando usa la API de SDK para .NET para cargar objetos grandes, puede presentarse un tiempo de espera mientras los datos se escriben en la secuencia de la solicitud. Puede establecer un tiempo de espera explícitamente con `UploadPartRequest`. 

En el siguiente ejemplo de código C\$1 se carga un archivo a un bucket de S3 con la API de bajo nivel para la carga multiparte. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .NET*. 

```
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class UploadFileMPULowLevelAPITest
    {
        private const string bucketName = "*** provide bucket name ***";
        private const string keyName = "*** provide a name for the uploaded object ***";
        private const string filePath = "*** provide the full path name of the file to upload ***";
        // 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("Uploading an object");
            UploadObjectAsync().Wait(); 
        }

        private static async Task UploadObjectAsync()
        {
            // Create list to store upload part responses.
            List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();

            // Setup information required to initiate the multipart upload.
            InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
            {
                BucketName = bucketName,
                Key = keyName
            };

            // Initiate the upload.
            InitiateMultipartUploadResponse initResponse =
                await s3Client.InitiateMultipartUploadAsync(initiateRequest);

            // Upload parts.
            long contentLength = new FileInfo(filePath).Length;
            long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB

            try
            {
                Console.WriteLine("Uploading parts");
        
                long filePosition = 0;
                for (int i = 1; filePosition < contentLength; i++)
                {
                    UploadPartRequest uploadRequest = new UploadPartRequest
                        {
                            BucketName = bucketName,
                            Key = keyName,
                            UploadId = initResponse.UploadId,
                            PartNumber = i,
                            PartSize = partSize,
                            FilePosition = filePosition,
                            FilePath = filePath
                        };

                    // Track upload progress.
                    uploadRequest.StreamTransferProgress +=
                        new EventHandler<StreamTransferProgressArgs>(UploadPartProgressEventCallback);

                    // Upload a part and add the response to our list.
                    uploadResponses.Add(await s3Client.UploadPartAsync(uploadRequest));

                    filePosition += partSize;
                }

                // Setup to complete the upload.
                CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
                    {
                        BucketName = bucketName,
                        Key = keyName,
                        UploadId = initResponse.UploadId
                     };
                completeRequest.AddPartETags(uploadResponses);

                // Complete the upload.
                CompleteMultipartUploadResponse completeUploadResponse =
                    await s3Client.CompleteMultipartUploadAsync(completeRequest);
            }
            catch (Exception exception)
            {
                Console.WriteLine("An AmazonS3Exception was thrown: { 0}", exception.Message);

                // Abort the upload.
                AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
                {
                    BucketName = bucketName,
                    Key = keyName,
                    UploadId = initResponse.UploadId
                };
               await s3Client.AbortMultipartUploadAsync(abortMPURequest);
            }
        }
        public static void UploadPartProgressEventCallback(object sender, StreamTransferProgressArgs e)
        {
            // Process event. 
            Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
        }
    }
}
```

------
#### [ PHP ]

En este tema, se muestra cómo usar el método `uploadPart` de bajo nivel de la versión 3 de AWS SDK para PHP para cargar un archivo en varias partes. Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte [SDK de AWS para Ruby, versión 2](https://docs.aws.amazon.com/sdkforruby/api/index.html).

En el siguiente ejemplo de PHP se carga un archivo a un bucket de Amazon S3 con la API de PHP de bajo nivel para la carga multiparte.

```
 require 'vendor/autoload.php';

use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$filename = '*** Path to and Name of the File to Upload ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

$result = $s3->createMultipartUpload([
    'Bucket'       => $bucket,
    'Key'          => $keyname,
    'StorageClass' => 'REDUCED_REDUNDANCY',
    'Metadata'     => [
        'param1' => 'value 1',
        'param2' => 'value 2',
        'param3' => 'value 3'
    ]
]);
$uploadId = $result['UploadId'];

// Upload the file in parts.
try {
    $file = fopen($filename, 'r');
    $partNumber = 1;
    while (!feof($file)) {
        $result = $s3->uploadPart([
            'Bucket'     => $bucket,
            'Key'        => $keyname,
            'UploadId'   => $uploadId,
            'PartNumber' => $partNumber,
            'Body'       => fread($file, 5 * 1024 * 1024),
        ]);
        $parts['Parts'][$partNumber] = [
            'PartNumber' => $partNumber,
            'ETag' => $result['ETag'],
        ];
        $partNumber++;

        echo "Uploading part $partNumber of $filename." . PHP_EOL;
    }
    fclose($file);
} catch (S3Exception $e) {
    $result = $s3->abortMultipartUpload([
        'Bucket'   => $bucket,
        'Key'      => $keyname,
        'UploadId' => $uploadId
    ]);

    echo "Upload of $filename failed." . PHP_EOL;
}

// Complete the multipart upload.
$result = $s3->completeMultipartUpload([
    'Bucket'   => $bucket,
    'Key'      => $keyname,
    'UploadId' => $uploadId,
    'MultipartUpload'    => $parts,
]);
$url = $result['Location'];

echo "Uploaded $filename to $url." . PHP_EOL;
```

------

## Mediante AWS SDK para Ruby
<a name="mpuoverview-ruby-sdk"></a>

La versión 3 de AWS SDK para Ruby admite cargas multiparte de Amazon S3 de dos maneras. Para la primera opción, puede utilizar cargas de archivos administrados. Para obtener más información, consulte [Uploading Files to Amazon S3](https://aws.amazon.com/blogs/developer/uploading-files-to-amazon-s3/) en el *Blog para desarrolladores de AWS*. Las cargas de archivos administrados son el método recomendado para cargar archivos en un bucket. Proporcionan los siguientes beneficios:
+ Administrar cargas multiparte para objetos de más de 15 MB.
+ Abra correctamente los archivos en modo binario para evitar problemas de codificación.
+ Utilice varios subprocesos para cargar partes de objetos grandes en simultáneo.

Como alternativa, puede utilizar directamente las siguientes operaciones de cliente de carga multiparte:
+ [create\$1multipart\$1upload](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#create_multipart_upload-instance_method): inicia una carga multiparte y devuelve un ID de carga.
+ [upload\$1part](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#upload_part-instance_method): carga una parte en una carga multiparte.
+ [upload\$1part\$1copy](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#upload_part_copy-instance_method): carga una parte al copiar los datos de un objeto existente como origen de datos.
+ [complete\$1multipart\$1upload](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#complete_multipart_upload-instance_method): completa una carga multiparte al combinar las partes cargadas previamente.
+ [abort\$1multipart\$1upload](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#abort_multipart_upload-instance_method): para una carga multiparte.

# Carga de un directorio utilizando la clase TransferUtility de .NET de alto nivel
<a name="HLuploadDirDotNet"></a>

Puede utilizar la clase `TransferUtility` para cargar todo un directorio. De forma predeterminada, la API solo carga los archivos en la raíz del directorio especificado. Sin embargo, puede especificar que se carguen los archivos de forma recursiva en todos los subdirectorios. 

Puede especificar expresiones de filtrado para seleccionar archivos en el directorio especificado según algunos criterios de filtrado. Por ejemplo, para cargar solo archivos `PDF` desde un directorio, especifique la expresión de filtrado `"*.pdf"`. 

Cuando carga archivos desde un directorio, no puede especificar los nombres de clave de los objetos resultantes. Amazon S3 construye los nombres de clave usando la ruta del archivo original. Por ejemplo, suponga que tiene un directorio llamado `c:\myfolder` con la siguiente estructura:

**Example**  

```
1. C:\myfolder
2.       \a.txt
3.       \b.pdf
4.       \media\               
5.              An.mp3
```

Cuando carga este directorio, Amazon S3 utiliza los siguientes nombres de clave:

**Example**  

```
1. a.txt
2. b.pdf
3. media/An.mp3
```

**Example**  
En el siguiente ejemplo de código C\$1 se carga un directorio a un bucket de Amazon S3. Muestra cómo utilizar varias sobrecargas `TransferUtility.UploadDirectory` para cargar el directorio. Cada llamada sucesiva de carga reemplaza la carga anterior. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .NET*.   

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class UploadDirMPUHighLevelAPITest
    {
        private const string existingBucketName = "*** bucket name ***";
        private const string directoryPath = @"*** directory path ***";
        // The example uploads only .txt files.
        private const string wildCard = "*.txt";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;
        static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            UploadDirAsync().Wait();
        }

        private static async Task UploadDirAsync()
        {
            try
            {
                var directoryTransferUtility =
                    new TransferUtility(s3Client);

                // 1. Upload a directory.
                await directoryTransferUtility.UploadDirectoryAsync(directoryPath,
                    existingBucketName);
                Console.WriteLine("Upload statement 1 completed");

                // 2. Upload only the .txt files from a directory 
                //    and search recursively. 
                await directoryTransferUtility.UploadDirectoryAsync(
                                               directoryPath,
                                               existingBucketName,
                                               wildCard,
                                               SearchOption.AllDirectories);
                Console.WriteLine("Upload statement 2 completed");

                // 3. The same as Step 2 and some optional configuration. 
                //    Search recursively for .txt files to upload.
                var request = new TransferUtilityUploadDirectoryRequest
                {
                    BucketName = existingBucketName,
                    Directory = directoryPath,
                    SearchOption = SearchOption.AllDirectories,
                    SearchPattern = wildCard
                };

                await directoryTransferUtility.UploadDirectoryAsync(request);
                Console.WriteLine("Upload statement 3 completed");
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine(
                        "Error encountered ***. 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);
            }
        }
    }
}
```

# Descripción de cargas multiparte
<a name="list-mpu"></a>

Puede utilizar la AWS CLI, la API de REST o los AWS SDK para obtener una lista de cargas multiparte en curso en Amazon S3. Puede utilizar la carga multiparte para cargar mediante programación un solo objeto en Amazon S3. Las cargas multiparte trasladan objetos a Amazon S3 moviendo una parte de los datos de un objeto a la vez. Para obtener más información general sobre las cargas multiparte, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md). 

Para conocer un procedimiento integral sobre la carga de un objeto con carga multiparte con una suma de comprobación adicional, consulte [Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos](tutorial-s3-mpu-additional-checksums.md).

En la siguiente sección se muestra cómo obtener una lista de las cargas multiparte en curso con la AWS Command Line Interface, la API de REST de Amazon S3 y los AWS SDK.

## Descripción de cargas multiparte con la AWS CLI
<a name="list-mpu-cli"></a>

En las siguientes secciones de AWS Command Line Interface, se describen las operaciones para visualizar listas de las cargas multiparte. 
+ [list-parts](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-parts.html): describe las partes cargadas para una carga multiparte específica.
+ [list-multipart-uploads](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html): describe las cargas multiparte en curso.

# Descripción de cargas multiparte con la API de REST
<a name="list-mpu-rest"></a>

Las siguientes secciones de la *Referencia de API de Amazon Simple Storage Service* especifican la API de REST para describir cargas multiparte:
+ [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html): describe las partes cargadas para una carga multiparte específica.
+ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html): describe las cargas multiparte en curso.

## Descripción de cargas multiparte con el SDK de AWS (API de bajo nivel)
<a name="list-aws-sdk"></a>

------
#### [ Java ]

Para mostrar todas las cargas multiparte en curso en un bucket mediante el AWS SDK para Java, puede utilizar las clases de API de bajo nivel para:


**Proceso de descripción de cargas multiparte de API de bajo nivel**  

|  |  | 
| --- |--- |
| 1 | Cree una instancia de la clase `ListMultipartUploadsRequest` y proporcione el nombre del bucket. | 
| 2 | Ejecute el método S3Client `listMultipartUploads`. El método devuelve una instancia de la clase `ListMultipartUploadsResponse` que le brinda información sobre las cargas multipartes en proceso. | 

Para ver ejemplos de cómo mostrar cargas multiparte con el AWS SDK para Java, consulte [Mostrar cargas multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_ListMultipartUploads_section.html) en la *Referencia de la API de Amazon S3*.

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

Para enumerar todas las cargas multiparte en curso en un bucket concreto, use la clase SDK para .NET de la API de carga multiparte de bajo nivel de `ListMultipartUploadsRequest`. El método `AmazonS3Client.ListMultipartUploads` devuelve una instancia de la clase `ListMultipartUploadsResponse` que ofrece información sobre las cargas multiparte en curso. 

Una carga multiparte en curso es una carga multiparte que se ha iniciado mediante una solicitud de carga multiparte pero que aún no se ha completado o detenido. Para obtener más información acerca de las cargas multiparte en Amazon S3, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

En el siguiente ejemplo de código C\$1 se muestra cómo usar SDK para .NET para enumerar todas las cargas multiparte en curso en un bucket. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .NET*. 

```
ListMultipartUploadsRequest request = new ListMultipartUploadsRequest
{
	 BucketName = bucketName // Bucket receiving the uploads.
};

ListMultipartUploadsResponse response = await AmazonS3Client.ListMultipartUploadsAsync(request);
```

------
#### [ PHP ]

Este tema muestra cómo usar las clases de API de bajo nivel de la versión 3 de AWS SDK para PHP para crear una lista de todas las cargas multiparte en curso en un bucket. Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte [SDK de AWS para Ruby, versión 2](https://docs.aws.amazon.com/sdkforruby/api/index.html).

El siguiente ejemplo de PHP demuestra cómo enumerar todas las cargas multiparte en curso en un bucket.

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Retrieve a list of the current multipart uploads.
$result = $s3->listMultipartUploads([
    'Bucket' => $bucket
]);

// Write the list of uploads to the page.
print_r($result->toArray());
```

------

# Seguimiento de una carga multiparte con los AWS SDK
<a name="track-mpu"></a>

Puede realizar un seguimiento del progreso de carga de un objeto en Amazon S3 con una interfaz de escucha. La API de carga multiparte de alto nivel proporciona una interfaz de escucha de este tipo, llamada `ProgressListener`. Los eventos de progreso se producen de forma periódica y notifican la transferencia de bytes al agente de escucha. Para obtener más información general sobre las cargas multiparte, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

Para conocer un procedimiento integral sobre la carga de un objeto con carga multiparte con una suma de comprobación adicional, consulte [Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos](tutorial-s3-mpu-additional-checksums.md).

En la siguiente sección, se muestra cómo realizar el seguimiento de una carga multiparte con los AWS SDK.

------
#### [ Java ]

**Example**  
El siguiente código Java carga un archivo y utiliza la interfaz `ExecutionInterceptor` para hacer el seguimiento del progreso de la carga. Para obtener instrucciones sobre cómo crear y probar un ejemplo funcional, consulte [Introducción](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html) en la Guía para desarrolladores de AWS SDK para Java 2.x.   

```
import java.nio.file.Paths;

import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.core.interceptor.Context;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;

public class TrackMPUProgressUsingHighLevelAPI {

    static class ProgressListener implements ExecutionInterceptor {
        private long transferredBytes = 0;

        @Override
        public void beforeTransmission(Context.BeforeTransmission context, ExecutionAttributes executionAttributes) {
            if (context.httpRequest().firstMatchingHeader("Content-Length").isPresent()) {
                String contentLength = context.httpRequest().firstMatchingHeader("Content-Length").get();
                long partSize = Long.parseLong(contentLength);
                transferredBytes += partSize;
                System.out.println("Transferred bytes: " + transferredBytes);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        String existingBucketName = "*** Provide bucket name ***";
        String keyName = "*** Provide object key ***";
        String filePath = "*** file to upload ***";

        S3AsyncClient s3Client = S3AsyncClient.builder()
                .credentialsProvider(ProfileCredentialsProvider.create())
                .overrideConfiguration(c -> c.addExecutionInterceptor(new ProgressListener()))
                .build();

        // For more advanced uploads, you can create a request object
        // and supply additional request parameters (ex: progress listeners,
        // canned ACLs, etc.)
        PutObjectRequest request = PutObjectRequest.builder()
                .bucket(existingBucketName)
                .key(keyName)
                .build();

        AsyncRequestBody requestBody = AsyncRequestBody.fromFile(Paths.get(filePath));

        // You can ask the upload for its progress, or you can
        // add a ProgressListener to your request to receive notifications
        // when bytes are transferred.
        // S3AsyncClient processes all transfers asynchronously,
        // so this call will return immediately.
        var upload = s3Client.putObject(request, requestBody);

        try {
            // You can block and wait for the upload to finish
            upload.join();
        } catch (Exception exception) {
            System.out.println("Unable to upload file, upload aborted.");
            exception.printStackTrace();
        } finally {
            s3Client.close();
        }
    }
}
```

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

En el siguiente ejemplo de código C\$1 se carga un archivo a un bucket de S3 mediante la clase `TransferUtility` y se sigue el progreso de la carga. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .NET*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class TrackMPUUsingHighLevelAPITest
    {
        private const string bucketName = "*** provide the bucket name ***";
        private const string keyName = "*** provide the name for the uploaded object ***";
        private const string filePath = " *** provide the full path name of the file to upload **";
        // 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);
            TrackMPUAsync().Wait();
        }

        private static async Task TrackMPUAsync()
        {
            try
            {
                var fileTransferUtility = new TransferUtility(s3Client);

                // Use TransferUtilityUploadRequest to configure options.
                // In this example we subscribe to an event.
                var uploadRequest =
                    new TransferUtilityUploadRequest
                    {
                        BucketName = bucketName,
                        FilePath = filePath,
                        Key = keyName
                    };

                uploadRequest.UploadProgressEvent +=
                    new EventHandler<UploadProgressArgs>
                        (uploadRequest_UploadPartProgressEvent);

                await fileTransferUtility.UploadAsync(uploadRequest);
                Console.WriteLine("Upload completed");
            }
            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);
            }
        }

        static void uploadRequest_UploadPartProgressEvent(object sender, UploadProgressArgs e)
        {
            // Process event.
            Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
        }
    }
}
```

------

# Anulación de la carga multiparte
<a name="abort-mpu"></a>

Comience a cargar las partes luego de iniciar una carga multiparte. Amazon S3 almacena estas partes y solo crea el objeto después de haya cargado todas las partes y enviado una solicitud para completar la carga multiparte. Al recibir la solicitud de carga multiparte completa, Amazon S3 combina las partes y crea un objeto. Si no envía correctamente la solicitud de carga multiparte completa, S3 no combina las partes y no crea un objeto. Si no desea completar una carga multiparte después de cargar las partes, debe anularla.

Se facturará todo el almacenamiento asociado con las partes cargadas. Se recomienda completar siempre la carga multiparte o detenerla con el fin de eliminar las partes cargadas. Para obtener más información sobre los precios de , consulte [Carga multiparte y precios](mpuoverview.md#mpuploadpricing).

También puede detener una carga multiparte incompleta mediante una configuración de ciclo de vida del bucket. Para obtener más información, consulte [Configuración de una política de ciclo de vida del bucket para eliminar cargas multiparte incompletas](mpu-abort-incomplete-mpu-lifecycle-config.md).

En la siguiente sección se muestra cómo detener una carga multiparte en curso en Amazon S3 con la AWS Command Line Interface, la API de REST o los AWS SDK.

## Uso de AWS CLI
<a name="abort-mpu-cli"></a>

Para obtener más información acerca del uso de la AWS CLI a fin de detener una carga multiparte, consulte [abort-multipart-upload](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/abort-multipart-upload.html) en la *Referencia de comandos de la AWS CLI*.

## Uso de la API de REST
<a name="abort-mpu-rest"></a>

Para obtener más información sobre el uso de la API de REST a fin de detener una carga multiparte, consulte [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) en la *Referencia de API de Amazon Simple Storage Service*.

## Uso de los SDK de AWS (API de alto nivel)
<a name="abort-mpu-high-level"></a>

------
#### [ Java ]

Para detener las cargas multiparte en curso mediante el AWS SDK para Java, puede anular las cargas que se iniciaron antes de una fecha específica y que aún están en curso. Una carga se considera en curso después de que la inicia y hasta que la completa o detiene.

Para detener las cargas multiparte, puede hacer lo siguiente:


|  |  | 
| --- |--- |
| 1 | Cree una instancia de S3Client. | 
| 2 | Utilice los métodos de cancelación del cliente al pasar el nombre del bucket y otros parámetros necesarios. | 

**nota**  
También puede detener una carga multiparte específica. Para obtener más información, consulte [Uso de los SDK de AWS (API de bajo nivel)](#abort-mpu-low-level).

Para ver ejemplos de cómo abortar cargas multiparte con el AWS SDK para Java, consulte [Cancelar una carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_AbortMultipartUpload_section.html) en la *Referencia de la API de Amazon S3*.

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

En el siguiente ejemplo de código C\$1 se detienen todas las cargas multiparte en curso que se iniciaron en un bucket específico hace una semana. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .NET*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class AbortMPUUsingHighLevelAPITest
    {
        private const string bucketName = "*** provide bucket name ***";
        // 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);
            AbortMPUAsync().Wait();
        }

        private static async Task AbortMPUAsync()
        {
            try
            {
                var transferUtility = new TransferUtility(s3Client);

                // Abort all in-progress uploads initiated before the specified date.
                await transferUtility.AbortMultipartUploadsAsync(
                    bucketName, DateTime.Now.AddDays(-7));
            }
            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);
            }
        } 
    }
}
```

**nota**  
También puede detener una carga multiparte específica. Para obtener más información, consulte [Uso de los SDK de AWS (API de bajo nivel)](#abort-mpu-low-level). 

------

## Uso de los SDK de AWS (API de bajo nivel)
<a name="abort-mpu-low-level"></a>

Puede detener una carga multiparte en curso si llama al método `AmazonS3.abortMultipartUpload`. Este método elimina cualquier parte cargada Amazon S3 y libera los recursos. Deberá proporcionar el ID de carga, el nombre del bucket y el nombre de clave. En el siguiente ejemplo de código Java se muestra cómo detener una carga multiparte en curso.

Para detener una carga multiparte, debe proporcionar el ID de carga y los nombres de clave y bucket que se usaron en la carga. Luego de haber detenido una carga multiparte, no puede usar el ID de carga para cargar partes adicionales. Para obtener más información acerca de las cargas multiparte en Amazon S3, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

------
#### [ Java ]

Para detener una carga multiparte específica en curso mediante el AWS SDK para Java, puede usar la API de bajo nivel para abortar la carga proporcionando el nombre del bucket, la clave de objeto y el ID de carga.

**nota**  
En lugar de abortar una carga multiparte específica, puede detener todas las cargas multiparte iniciadas antes de un periodo de tiempo específico que siguen en proceso. Esta operación de limpieza es útil para detener las cargas multiparte antiguas que inició pero que no se completaron o detuvieron. Para obtener más información, consulte [Uso de los SDK de AWS (API de alto nivel)](#abort-mpu-high-level).

Para ver ejemplos de cómo abortar una carga multiparte específica con el AWS SDK para Java, consulte [Cancelar una carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_AbortMultipartUpload_section.html) en la *Referencia de la API de Amazon S3*.

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

En el siguiente ejemplo en C\$1 se muestra cómo detener una carga multiparte. Para ver una muestra completa de código C\$1 que incluye el código siguiente, consulte [Uso de los SDK de AWS (API de bajo nivel)](mpu-upload-object.md#mpu-upload-low-level).

```
AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
{
    BucketName = existingBucketName,
    Key = keyName,
    UploadId = initResponse.UploadId
};
await AmazonS3Client.AbortMultipartUploadAsync(abortMPURequest);
```

También puede anular todas las cargas multiparte en curso que se iniciaron antes de un periodo de tiempo específico. Esta operación de limpieza resulta útil para anular cargas multiparte que no se finalizaron o que se anularon. Para obtener más información, consulte [Uso de los SDK de AWS (API de alto nivel)](#abort-mpu-high-level).

------
#### [ PHP ]

En este ejemplo, se muestra cómo utilizar una clase de la versión 3 de AWS SDK para PHP a fin de anular una carga multiparte que está en curso. Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte [SDK de AWS para Ruby, versión 2](https://docs.aws.amazon.com/sdkforruby/api/index.html). El ejemplo es el método `abortMultipartUpload()`. 

Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte [SDK de AWS para Ruby, versión 2](https://docs.aws.amazon.com/sdkforruby/api/index.html).

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$uploadId = '*** Upload ID of upload to Abort ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Abort the multipart upload.
$s3->abortMultipartUpload([
    'Bucket'   => $bucket,
    'Key'      => $keyname,
    'UploadId' => $uploadId,
]);
```

------

# Copiar un objeto con la carga multiparte
<a name="CopyingObjectsMPUapi"></a>

La carga multiparte permite copiar objetos como un conjunto de partes. En esta sección se muestran ejemplos sobre cómo copiar objetos superiores a 5 GB con la Application Programming Interface (API, Interfaz de programación de aplicaciones) de carga multiparte. Para obtener información sobre cargas multiparte, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

Puede copiar objetos inferiores a 5 GB en una sola operación sin utilizar la API de carga multiparte. Puede copiar objetos inferiores a 5 GB mediante la Consola de administración de AWS, la AWS CLI, la API de REST o los AWS SDK. Para obtener más información, consulte [Copia, traslado y cambio de nombre de objetos](copy-object.md). 

Para conocer un procedimiento integral sobre la carga de un objeto con carga multiparte con una suma de comprobación adicional, consulte [Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos](tutorial-s3-mpu-additional-checksums.md).

En la siguiente sección, se muestra cómo copiar un objeto con carga multiparte con la API de REST o los AWS SDK.

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

Las siguientes secciones de la *referencia de API de Amazon Simple Storage Service* describen la API de REST para la carga multiparte. Para copiar un objeto existente, utilice la API Upload Part (Copy) y agregue el encabezado de solicitud `x-amz-copy-source` a su solicitud a fin de especificar el objeto de origen. 
+ [Initiate Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Upload Part](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Upload Part (Copy)](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)
+ [Finalización de una carga multiparte](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Abort Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html)
+ [List Parts](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html)
+ [List Multipart Uploads](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html)

Puede utilizar estas API para realizar sus propias solicitudes REST o puede utilizar uno de los SDK que ofrecemos. Para obtener más información sobre el uso de la carga multiparte con la AWS CLI, consulte [Mediante AWS CLI](mpu-upload-object.md#UsingCLImpUpload). Para obtener más información sobre SDKs, consulte [AWSCompatibilidad de  SDK con cargas multiparte](mpuoverview.md#sdksupportformpu).

## Uso de los AWS SDK
<a name="copy-object-mpu-sdks"></a>

Para copiar un objeto con la API de bajo nivel, siga estos pasos:
+ Inicie una carga multiparte con el llamado al método `AmazonS3Client.initiateMultipartUpload()`.
+ Guarde el ID de carga del objeto de respuesta que devuelve el método `AmazonS3Client.initiateMultipartUpload()`. Facilite este ID de carga para cada operación de carga de parte.
+ Copie todas las partes. Para cada parte que necesite copiar, cree una nueva instancia de la clase `CopyPartRequest`. Proporcione la información de parte, incluidos los nombres de los bucket de origen y destino, las claves de los objetos de origen y de destino, los ID de carga, las ubicaciones del primer y último byte de la parte y el número de parte. 
+ Guarde las respuestas de las llamadas del método `AmazonS3Client.copyPart()`. Cada respuesta incluye el valor de `ETag` y el número de parte de la parte cargada. Necesitará esta información para completar la carga multiparte: 
+ Llame al método `AmazonS3Client.completeMultipartUpload()` para completar la operación de copia. 

------
#### [ Java ]

Para ver ejemplos de cómo copiar objetos mediante la carga multiparte con el 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) en la *Referencia de la API de Amazon S3*.

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

En el siguiente ejemplo de código C\$1, se muestra cómo usar SDK para .NET para copiar un objeto de Amazon S3 mayor que 5 GB de una ubicación de origen a otra, como, por ejemplo, de un bucket a otro. Para copiar objetos menores de 5 GB, use el procedimiento de copia de una sola operación descrito en [Uso de los AWS SDK](copy-object.md#CopyingObjectsUsingSDKs). Para obtener más información acerca de las cargas multiparte en Amazon S3, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md).

En este ejemplo, se muestra cómo copiar un objeto de Amazon S3 con un tamaño superior a 5 GB de un bucket de S3 a otro con la API de carga multiparte de 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);
            }
        }
    }
}
```

------

# Tutorial: Cargar un objeto mediante una carga multiparte y verificar la integridad de sus datos
<a name="tutorial-s3-mpu-additional-checksums"></a>

 La carga multiparte permite cargar un solo objeto como un conjunto de partes. Cada parte es una parte contigua de los datos del objeto. Puede cargar estas partes del objeto de forma independiente y en cualquier orden. Si la transmisión de cualquier parte falla, puede retransmitir esta parte sin que las demás partes se vean afectadas. Después de cargar todas las partes del objeto, Amazon S3 las combina y crea el objeto. Por lo general, cuando el tamaño del objeto alcanza los 100 MB, deberá usar las cargas multipartes en lugar de cargar el objeto en una única operación. Para obtener más información acerca de las cargas multipartes, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md). Para conocer los límites relacionados con las cargas multiparte, consulte [Límites de carga multiparte de Amazon S3](qfacts.md).

 Puede utilizar sumas de verificación para comprobar que los activos no se modifican al copiarlos. La realización de una suma de comprobación consiste en utilizar un algoritmo para iterar secuencialmente cada byte de un archivo. Amazon S3 ofrece varias opciones de suma de comprobación para comprobar la integridad de los datos. Le recomendamos que realice estas comprobaciones de integridad como práctica recomendada de durabilidad y para confirmar que todos los bytes se transfieren sin alteraciones. Amazon S3 también admite los siguientes algoritmos: SHA-1, SHA-256, CRC32 y CRC32C. Amazon S3 utiliza uno o más de estos algoritmos para calcular un valor de suma de comprobación adicional y almacenarlo como parte de los metadatos del objeto. Para obtener más información acerca de las sumas de comprobación, consulte [Comprobación de la integridad de objetos en Amazon S3](checking-object-integrity.md).

**Objetivo**  
 En este tutorial, obtendrá información sobre cómo cargar un objeto en Amazon S3 mediante una carga multiparte y una suma de comprobación SHA-256 adicional a través de la interfaz de línea de comandos de AWS (CLI de AWS). También obtendrá información sobre cómo comprobar la integridad de los datos del objeto mediante el cálculo del hash MD5 y la suma de comprobación SHA-256 del objeto cargado. 

**Topics**
+ [Requisitos previos](#mpu-prerequisites)
+ [Paso 1: Creación de un archivo grande](#create-large-file-step1)
+ [Paso 2: División del archivo en varios archivos](#split-large-file-step2)
+ [Paso 3: Creación de la carga multiparte con una suma de comprobación adicional](#create-multipart-upload-step3)
+ [Paso 4: Carga de las partes de la carga multiparte](#upload-parts-step4)
+ [Paso 5: Muestra de todas las partes de la carga multiparte](#list-parts-step5)
+ [Paso 6: Completar la carga multiparte](#complete-multipart-upload-step6)
+ [Paso 7: Confirmación de que el objeto se ha cargado en el bucket](#confirm-upload-step7)
+ [Paso 8: Comprobación de la integridad del objeto con una suma de comprobación MD5](#verify-object-integrity-step8)
+ [Paso 9: Comprobación de la integridad del objeto con una suma de comprobación adicional](#verify-object-integrity-sha256-step9)
+ [Paso 10: Eliminar los recursos](#clean-up-step10)

## Requisitos previos
<a name="mpu-prerequisites"></a>
+ Antes de empezar este tutorial, asegúrese de tener acceso a un bucket de Amazon S3 en el que pueda cargar. Para obtener más información, consulte [Creación de un bucket de uso general](create-bucket-overview.md).
+  Debe tener instalada y configurada la CLI de AWS. Si aún no ha instalado la CLI de AWS, consulte [Instalar o actualizar la última versión de la AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html) en la *Guía del usuario de AWS Command Line Interface*.
+ De forma alternativa, puede ejecutar comandos de la CLI de AWS desde la consola mediante AWS CloudShell. AWS CloudShell es un intérprete de comandos previamente autenticado y basado en el navegador que se puede lanzar directamente desde la Consola de administración de AWS. Para obtener más información, consulte [¿Qué es CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) e [Introducción a AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html) en la *Guía el usuario de AWS CloudShell*.

## Paso 1: Creación de un archivo grande
<a name="create-large-file-step1"></a>

Si ya tiene un archivo listo para cargar, puede usarlo para este tutorial. De lo contrario, cree un archivo de 15 MB siguiendo estos pasos. Para conocer los límites relacionados con las cargas multiparte, consulte [Límites de carga multiparte de Amazon S3](qfacts.md).

**Creación de un archivo grande**

Utilice uno de los siguientes comandos para crear el archivo, en función del sistema operativo que esté utilizando.

**Linux o macOS**  
Para crear un archivo de 15 MB, abra el terminal local y ejecute el siguiente comando:

```
dd if=/dev/urandom of=census-data.bin bs=1M count=15
```

Este comando crea un archivo llamado `census-data.bin` relleno de bytes aleatorios, con un tamaño de 15 MB.

**Windows**  
Para crear un archivo de 15 MB, abra el terminal local y ejecute el siguiente comando:

```
fsutil file createnew census-data.bin 15728640
```

Este comando crea un archivo llamado `census-data.bin` con un tamaño de 15 MB de datos arbitrarios (15728640 bytes).

## Paso 2: División del archivo en varios archivos
<a name="split-large-file-step2"></a>

Para realizar la carga multiparte, debe dividir el archivo grande en partes más pequeñas. A continuación, puede cargar las partes más pequeñas mediante el proceso de carga multiparte. En este paso se muestra cómo dividir el archivo grande creado en el [Paso 1](#create-large-file-step1) en partes más pequeñas. En el siguiente ejemplo, se utiliza un archivo de 15 MB llamado `census-data.bin`.

**División de un archivo grande en partes**

**Linux o macOS**  
Para dividir el archivo grande en partes de 5 MB, utilice el comando `split`. Abra el terminal y ejecute lo siguiente:

```
split -b 5M -d census-data.bin census-part
```

Este comando divide `census-data.bin` en partes de 5 MB llamadas `census-part**`, donde `**` es un sufijo numérico que comienza desde `00`.

**Windows**  
Para dividir el archivo grande, utilice PowerShell. Abra [Powershell](https://learn.microsoft.com/en-us/powershell/) y ejecute el siguiente script:

```
$inputFile = "census-data.bin"
$outputFilePrefix = "census-part"
$chunkSize = 5MB

$fs = [System.IO.File]::OpenRead($inputFile)
$buffer = New-Object byte[] $chunkSize
$fileNumber = 0

while ($fs.Position -lt $fs.Length) {
$bytesRead = $fs.Read($buffer, 0, $chunkSize)
$outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber
$fileStream = [System.IO.File]::Create($outputFile)
$fileStream.Write($buffer, 0, $bytesRead)
$fileStream.Close()
$fileNumber++
}

$fs.Close()
```

Este script de PowerShell lee el archivo grande en fragmentos de 5 MB y escribe cada fragmento en un archivo nuevo con un sufijo numérico.

Tras ejecutar el comando correspondiente, debería ver las partes del directorio donde ejecutó el comando. Cada parte tendrá un sufijo correspondiente a su número de pieza, por ejemplo:

```
census-part00 census-part01 census-part02
```

## Paso 3: Creación de la carga multiparte con una suma de comprobación adicional
<a name="create-multipart-upload-step3"></a>

Para iniciar el proceso de carga multiparte, debe crear la solicitud de carga multiparte. Este paso implica iniciar la carga multiparte y especificar una suma de verificación adicional para la integridad de los datos. En el siguiente ejemplo, se utiliza la suma de comprobación SHA-256. Si desea proporcionar metadatos que describen el objeto que se está cargando, debe proporcionarlos en la solicitud para iniciar la carga multiparte.

**nota**  
En este paso y en los siguientes, este tutorial utiliza el algoritmo adicional SHA-256. Otra opción, puede utilizar otra suma de comprobación adicional para estos pasos, como CRC32, CRC32C o SHA-1. Si usa un algoritmo diferente, debe usarlo a lo largo de los pasos del tutorial.

**Inicio de la carga multiparte**

En el terminal, use el siguiente comando `create-multipart-upload` para iniciar una carga multiparte para el bucket. Reemplace `amzn-s3-demo-bucket1` por el nombre real de su bucket. Además, sustituya `census_data_file` por el nombre de archivo elegido. Este nombre de archivo se convierte en la clave del objeto cuando se completa la carga.

```
aws s3api create-multipart-upload --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --checksum-algorithm sha256
```

Si la solicitud funciona correctamente, verá una salida JSON como la siguiente:

```
{
    "ServerSideEncryption": "AES256",
    "ChecksumAlgorithm": "SHA256",
    "Bucket": "amzn-s3-demo-bucket1",
    "Key": "census_data_file",
    "UploadId": "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz"
}
```

**nota**  
Al enviar una solicitud para iniciar una carga multiparte, Amazon S3 devuelve una respuesta con un ID de carga, que es un identificador único para su carga multiparte. Debe incluir este ID de carga siempre que cargue partes, muestre partes, complete una carga o pare una carga. Deberá usar los valores `UploadId`, `Key` y `Bucket` para los pasos posteriores, así que asegúrese de guardarlos.  
Además, si utiliza una carga multiparte con sumas de comprobación adicionales, los números de partes deben ser consecutivos. Si utiliza números de partes no consecutivos, la solicitud `complete-multipart-upload` puede generar un HTTP `500 Internal Server Error`.

## Paso 4: Carga de las partes de la carga multiparte
<a name="upload-parts-step4"></a>

En este paso, cargará las partes de la carga multiparte en el bucket de S3. Utilice el comando `upload-part` para cargar cada parte de forma individual. Este proceso requiere especificar el ID de carga, el número de parte y el archivo que se va a cargar para cada parte.

**Carga de las partes**

1. Al cargar una parte, además del ID de carga, debe especificar un número de parte mediante el argumento `--part-number`. Puede seleccionar cualquier número de parte comprendido entre 1 y 10 000. Un número de parte identifica exclusivamente una parte y su posición en el objeto que se está cargando. El número de parte que elija debe estar en una secuencia consecutiva (por ejemplo: puede ser 1, 2 o 3). Si carga una parte nueva con el mismo número que una parte ya cargada, se sobrescribirá la parte existente.

1. Utilice el comando `upload-part` para cargar cada parte de la carga multiparte. El `--upload-id` es el mismo que estaba en la salida creada por el comando `create-multipart-upload` del [Paso 3](#create-multipart-upload-step3). Para cargar la primera parte de los datos, utilice el siguiente comando:

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 1 --body census-part00 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256
   ```

   Al completar cada comando `upload-part`, debería ver un resultado similar al del siguiente ejemplo:

   ```
   {
       "ServerSideEncryption": "AES256",
       "ETag": "\"e611693805e812ef37f96c9937605e69\"",
       "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0="
   }
   ```

1. Para las partes siguientes, incremente el número de parte en consecuencia:

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number <part-number> --body <file-path> --upload-id "<your-upload-id>" --checksum-algorithm SHA256
   ```

   Por ejemplo, use el siguiente comando para cargar la segunda parte:

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 2 --body census-part01 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256
   ```

   Amazon S3 devuelve una etiqueta de entidad (ETag) y sumas de comprobación adicionales para cada parte cargada como un encabezado en la respuesta.

1. Siga utilizando el comando `upload-part` hasta que haya cargado todas las partes del objeto.

## Paso 5: Muestra de todas las partes de la carga multiparte
<a name="list-parts-step5"></a>

Para completar la carga multiparte, necesitará una lista de todas las partes que se han cargado para esa carga multiparte específica. El resultado del comando `list-parts` proporciona información como el nombre de bucket, la clave, el ID de carga, el número de parte, la ETag, las sumas de comprobación adicionales, etc. Resulta útil guardar este resultado en un archivo para poder utilizarlo en el siguiente paso al completar el proceso de carga multiparte. Puede crear un archivo de salida JSON llamado `parts.json` mediante el siguiente método.

**Creación de un archivo que muestre todas las partes**

1. Para generar un archivo JSON con los detalles de todas las partes cargadas, utilice el siguiente comando `list-parts`. Sustituya ***amzn-s3-demo-bucket1*** por el nombre real del bucket y **<your-upload-id>** por el ID de carga que recibió en el [Paso 3](#create-multipart-upload-step3). Para obtener más información sobre el comando `list-parts`, consulte [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html) en la *Guía del usuario de AWS Command Line Interface*.

   ```
   aws s3api list-parts --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id> --query '{Parts: Parts[*].{PartNumber: PartNumber, ETag: ETag, ChecksumSHA256: ChecksumSHA256}}' --output json > parts.json
   ```

   Se ha generado un nuevo archivo llamado `parts.json`. El archivo contiene la información en formato JSON de todas las partes cargadas. El archivo `parts.json` incluye información esencial para cada parte de la carga multiparte, como los números de parte y sus correspondientes valores de ETag, que son necesarios para completar el proceso de carga multiparte.

1. Abra `parts.json` con cualquier editor de texto o a través del terminal. Este es el ejemplo de salida:

   ```
   {
       "Parts": [
           {
               "PartNumber": 1,
               "ETag": "\"3c3097f89e2a2fece47ac54b243c9d97\"",
               "ChecksumSHA256": "fTPVHfyNHdv5VkR4S3EewdyioXECv7JBxN+d4FXYYTw="
           },
           {
               "PartNumber": 2,
               "ETag": "\"03c71cc160261b20ab74f6d2c476b450\"",
               "ChecksumSHA256": "VDWTa8enjOvULBAO3W2a6C+5/7ZnNjrnLApa1QVc3FE="
           },
           {
               "PartNumber": 3,
               "ETag": "\"81ae0937404429a97967dffa7eb4affb\"",
               "ChecksumSHA256": "cVVkXehUlzcwrBrXgPIM+EKQXPUvWist8mlUTCs4bg8="
           }
       ]
   }
   ```

## Paso 6: Completar la carga multiparte
<a name="complete-multipart-upload-step6"></a>

Tras cargar todas las partes de la carga multiparte y mostrarlas, el paso final consiste en completar la carga multiparte. En este paso, se combinan todas las partes cargadas en un único objeto del bucket de S3.

**nota**  
Puede calcular la suma de verificación del objeto antes de llamar a `complete-multipart-upload` al incluir `--checksum-sha256` en la solicitud. Si las sumas de comprobación no coinciden, Amazon S3 produce un error en la solicitud. Para obtener más información, consulte [https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html) en la *Guía del usuario de AWS Command Line Interface*.

**Completar la carga multiparte**

Para finalizar la carga multiparte, use el comando `complete-multipart-upload`. Este comando requiere el archivo `parts.json` creado en el [Paso 5](#list-parts-step5), el nombre del bucket y el ID de carga. Sustituya **<*amzn-s3-demo-bucket1*>** por el nombre del bucket y **<your-upload-id>** por el ID de carga de `parts.json`.

```
aws s3api complete-multipart-upload --multipart-upload file://parts.json --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id>
```

Este es el ejemplo de salida:

```
{
    "ServerSideEncryption": "AES256",
    "Location": "https://amzn-s3-demo-bucket1.s3.us-east-2.amazonaws.com/census_data_file",
    "Bucket": "amzn-s3-demo-bucket1",
    "Key": "census_data_file",
    "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"",
    "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3"
}
```

**nota**  
No elimine todavía los archivos de partes individuales. Necesitará las partes individuales para poder realizar sumas de comprobación en ellas y comprobar la integridad del objeto fusionado.

## Paso 7: Confirmación de que el objeto se ha cargado en el bucket
<a name="confirm-upload-step7"></a>

Tras completar la carga multiparte, puede comprobar que el objeto se ha cargado correctamente en el bucket de S3. Para mostrar los objetos del bucket y confirmar la presencia del archivo recién cargado, utilice el comando `list-objects-v2` 

**Muestra del objeto cargado**

Para mostrar los objetos del bucket, utilice el comando ‎`list-objects-v2`. Sustituya ***amzn-s3-demo-bucket1*** por el nombre real del bucket: 

```
aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket1
```

Este comando devuelve una lista de objetos del bucket. Busque el archivo cargado (por ejemplo, `census_data_file`) en la lista de objetos. 

Para obtener más información, consulte la sección de [Ejemplos](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html) del comando `list-objects-v2` en la *Guía del usuario de AWS Command Line Interface*.

## Paso 8: Comprobación de la integridad del objeto con una suma de comprobación MD5
<a name="verify-object-integrity-step8"></a>

Al cargar un objeto, puede especificar un algoritmo de suma de comprobación para que lo utilice Amazon S3. De forma predeterminada, Amazon S3 almacena el resumen MD5 de bytes como ETag del objeto. Para cargas multiparte, la ETag no es la suma de comprobación de todo el objeto, sino más bien una combinación de sumas de comprobación para cada parte individual.

**Verificación de la integridad del objeto mediante una suma de verificación MD5**

1. Para recuperar la ETag del objeto cargado, realice una solicitud `head-object`:

   ```
   aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file
   ```

   Este es el ejemplo de salida:

   ```
   {
       "AcceptRanges": "bytes",
       "LastModified": "2024-07-26T19:04:13+00:00",
       "ContentLength": 16106127360,
       "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"",
       "ContentType": "binary/octet-stream",
       "ServerSideEncryption": "AES256",
       "Metadata": {}
   }
   ```

   Esta ETag tiene un “-3” adjunto al final. Esto indica que el objeto se cargó en tres partes mediante la carga multiparte.

1. A continuación, calcule la suma de verificación MD5 de cada parte mediante el comando `md5sum`. Asegúrese de proporcionar la ruta correcta a los archivos de partes:

   ```
   md5sum census-part*
   ```

   Este es el ejemplo de salida:

   ```
   e611693805e812ef37f96c9937605e69 census-part00
   63d2d5da159178785bfd6b6a5c635854 census-part01
   95b87c7db852451bb38b3b44a4e6d310 census-part02
   ```

1. Para este paso, combine manualmente los hashes MD5 en una sola cadena. A continuación, ejecute el siguiente comando para convertir la cadena en binaria y calcular la suma de comprobación MD5 del valor binario:

   ```
   echo "e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310" | xxd -r -p | md5sum
   ```

   Este es el ejemplo de salida:

   ```
   f453c6dccca969c457efdf9b1361e291 -
   ```

   Este valor hash debe coincidir con el valor hash del valor de la ETag original del [Paso 1](#create-large-file-step1), lo que valida la integridad del objeto `census_data_file`.

Cuando indica a Amazon S3 que utilice sumas de comprobación adicionales, Amazon S3 calcula el valor de la suma de comprobación de cada parte y almacena los valores. Si quiere recuperar los valores de la suma de comprobación de partes individuales de las cargas multiparte que aún están en progreso, puede utilizar `list-parts`.

Para obtener más información sobre cómo funcionan las sumas de comprobación con objetos de carga multiparte, consulte [Comprobación de la integridad de objetos en Amazon S3](checking-object-integrity.md).

## Paso 9: Comprobación de la integridad del objeto con una suma de comprobación adicional
<a name="verify-object-integrity-sha256-step9"></a>

En este paso, este tutorial utiliza SHA-256 como suma de comprobación adicional para validar la integridad del objeto. Si ha utilizado una suma de comprobación adicional diferente, utilice ese valor de suma de comprobación en su lugar.

**Verificación de la integridad del objeto con SHA256**

1. Ejecute el siguiente comando en el terminal, incluido el argumento `--checksum-mode enabled`, para mostrar el valor `ChecksumSHA256` del objeto:

   ```
   aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file --checksum-mode enabled
   ```

   Este es el ejemplo de salida:

   ```
   {
       "AcceptRanges": "bytes",
       "LastModified": "2024-07-26T19:04:13+00:00",
       "ContentLength": 16106127360,
       "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3",
       "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"",
       "ContentType": "binary/octet-stream",
       "ServerSideEncryption": "AES256",
       "Metadata": {}
   }
   ```

1. Use los siguientes comandos para decodificar los valores `ChecksumSHA256` de las partes individuales en base64 y guardarlos en un archivo binario llamado `outfile`. Estos valores se pueden encontrar en el archivo `parts.json`. Sustituya las cadenas base64 del ejemplo por los valores `ChecksumSHA256` reales.

   ```
   echo "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" | base64 --decode >> outfile
   echo "xCdgs1K5Bm4jWETYw/CmGYr+m6O2DcGfpckx5NVokvE=" | base64 --decode >> outfile
   echo "f5wsfsa5bB+yXuwzqG1Bst91uYneqGD3CCidpb54mAo=" | base64 --decode >> outfile
   ```

1. Ejecute el siguiente comando para calcular la suma de comprobación SHA256 de `outfile`:

   ```
   sha256sum outfile
   ```

   Este es el ejemplo de salida:

   ```
   688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile
   ```

   En el siguiente paso, tome el valor hash y conviértalo en un valor binario. Este valor binario debe coincidir con el valor `ChecksumSHA256` del [Paso 1](#create-large-file-step1).

1. Convierta la suma de comprobación SHA256 del [Paso 3](#create-multipart-upload-step3) en binaria y, a continuación, codifíquela en base64 para comprobar que coincide con el valor `ChecksumSHA256` del [Paso 1](#create-large-file-step1):

   ```
   echo "688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9" | xxd -r -p | base64
   ```

   Este es el ejemplo de salida:

   ```
   aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=
   ```

   Esta salida debería confirmar que la salida en base64 coincide con el valor `ChecksumSHA256` de la salida del comando `head-object`. Si la salida coincide con el valor de la suma de comprobación, el objeto es válido.

**importante**  
Cuando indica a Amazon S3 que utilice sumas de comprobación adicionales, Amazon S3 calcula los valores de la suma de comprobación de cada parte y almacena estos valores.
Si quiere recuperar los valores de la suma de comprobación de partes individuales de las cargas multiparte que aún están en progreso, puede utilizar el comando `list-parts`.

## Paso 10: Eliminar los recursos
<a name="clean-up-step10"></a>

Si desea limpiar los archivos creados en este tutorial, use el siguiente método. Para obtener instrucciones sobre cómo eliminar los archivos cargados en el bucket de S3, consulte [Eliminación de objetos de Amazon S3](DeletingObjects.md).

**Elimine los archivos locales creados en el [Paso 1](#create-large-file-step1):**

Para eliminar los archivos que haya creado para la carga multiparte, ejecute el siguiente comando desde el directorio de trabajo:

```
rm census-data.bin census-part* outfile parts.json
```

# Límites de carga multiparte de Amazon S3
<a name="qfacts"></a>

La carga multiparte permite cargar un solo objeto como un conjunto de partes. Cada parte es una parte contigua de los datos del objeto. Después de cargar todas las partes del objeto, Amazon S3 las combina y crea el objeto. Por lo general, cuando el tamaño del objeto alcanza los 100 MB, deberá usar las cargas multipartes en lugar de cargar el objeto en una única operación. Para obtener más información acerca de las cargas multipartes, consulte [Carga y copia de objetos con la carga multiparte en Amazon S3](mpuoverview.md). 

En la siguiente tabla se proporcionan las especificaciones principales de la carga multiparte. Entre ellos se incluyen el tamaño máximo del objeto, el número máximo de partes, el tamaño máximo de las partes y mucho más. No hay límite de tamaño mínimo en la última parte de la carga multiparte.


| Elemento | Especificación | 
| --- | --- | 
| Tamaño máximo de objeto | 48,8 TiB  | 
| Cantidad máxima de partes por cada carga | 10 000 | 
| Números de parte | De 1 a 10 000 (inclusive) | 
| Tamaño de parte | De 5 MiB a 5 GiB. No hay límite de tamaño mínimo en la última parte de la carga multiparte. | 
| 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  | 