Carga de archivos grandes por partes con Amazon SDK for Java - Amazon S3 Glacier

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

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

Carga de archivos grandes por partes con Amazon SDK for Java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ejemplo: carga de un archivo grande por partes con AWS SDK for Java

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

nota

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

import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.glacier.AmazonGlacierClient; import com.amazonaws.services.glacier.TreeHashGenerator; import com.amazonaws.services.glacier.model.CompleteMultipartUploadRequest; import com.amazonaws.services.glacier.model.CompleteMultipartUploadResult; import com.amazonaws.services.glacier.model.InitiateMultipartUploadRequest; import com.amazonaws.services.glacier.model.InitiateMultipartUploadResult; import com.amazonaws.services.glacier.model.UploadMultipartPartRequest; import com.amazonaws.services.glacier.model.UploadMultipartPartResult; import com.amazonaws.util.BinaryUtils; public class ArchiveMPU { public static String vaultName = "examplevault"; // This example works for part sizes up to 1 GB. public static String partSize = "1048576"; // 1 MB. public static String archiveFilePath = "*** provide archive file path ***"; public static AmazonGlacierClient client; public static void main(String[] args) throws IOException { ProfileCredentialsProvider credentials = new ProfileCredentialsProvider(); client = new AmazonGlacierClient(credentials); client.setEndpoint("https://glacier.us-west-2.amazonaws.com/"); try { System.out.println("Uploading an archive."); String uploadId = initiateMultipartUpload(); String checksum = uploadParts(uploadId); String archiveId = CompleteMultiPartUpload(uploadId, checksum); System.out.println("Completed an archive. ArchiveId: " + archiveId); } catch (Exception e) { System.err.println(e); } } private static String initiateMultipartUpload() { // Initiate InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest() .withVaultName(vaultName) .withArchiveDescription("my archive " + (new Date())) .withPartSize(partSize); InitiateMultipartUploadResult result = client.initiateMultipartUpload(request); System.out.println("ArchiveID: " + result.getUploadId()); return result.getUploadId(); } private static String uploadParts(String uploadId) throws AmazonServiceException, NoSuchAlgorithmException, AmazonClientException, IOException { int filePosition = 0; long currentPosition = 0; byte[] buffer = new byte[Integer.valueOf(partSize)]; List<byte[]> binaryChecksums = new LinkedList<byte[]>(); File file = new File(archiveFilePath); FileInputStream fileToUpload = new FileInputStream(file); String contentRange; int read = 0; while (currentPosition < file.length()) { read = fileToUpload.read(buffer, filePosition, buffer.length); if (read == -1) { break; } byte[] bytesRead = Arrays.copyOf(buffer, read); contentRange = String.format("bytes %s-%s/*", currentPosition, currentPosition + read - 1); String checksum = TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(bytesRead)); byte[] binaryChecksum = BinaryUtils.fromHex(checksum); binaryChecksums.add(binaryChecksum); System.out.println(contentRange); //Upload part. UploadMultipartPartRequest partRequest = new UploadMultipartPartRequest() .withVaultName(vaultName) .withBody(new ByteArrayInputStream(bytesRead)) .withChecksum(checksum) .withRange(contentRange) .withUploadId(uploadId); UploadMultipartPartResult partResult = client.uploadMultipartPart(partRequest); System.out.println("Part uploaded, checksum: " + partResult.getChecksum()); currentPosition = currentPosition + read; } fileToUpload.close(); String checksum = TreeHashGenerator.calculateTreeHash(binaryChecksums); return checksum; } private static String CompleteMultiPartUpload(String uploadId, String checksum) throws NoSuchAlgorithmException, IOException { File file = new File(archiveFilePath); CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest() .withVaultName(vaultName) .withUploadId(uploadId) .withChecksum(checksum) .withArchiveSize(String.valueOf(file.length())); CompleteMultipartUploadResult compResult = client.completeMultipartUpload(compRequest); return compResult.getLocation(); } }