Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Transferir archivos y directorios con Amazon S3 Transfer Manager
Amazon S3 Transfer Manager es una utilidad de transferencia de archivos de alto nivel y de código abierto para el AWS SDK for Java 2.x. Úselo para transferir archivos y directorios desde y hacia Amazon Simple Storage Service (Amazon S3).
Cuando se basa en el cliente S3 AWS CRT basado en el cliente S3, el S3 Transfer Manager puede aprovechar las mejoras de rendimiento, como la carga multiparte API y las recuperaciones por rango de bytes.
Con el S3 Transfer Manager, también puede supervisar el progreso de una transferencia en tiempo real y pausarla para su posterior ejecución.
Introducción
Añadir dependencias a su archivo de compilación
Para utilizar el S3 Transfer Manager con un rendimiento mejorado basado en el cliente S3 basado en el AWS CRT cliente S3, configure el archivo de compilación con las siguientes dependencias.
-
Utilice la versión
2.19.1
o superior a la versión 2.x SDK para Java. -
Agregue el artefacto
s3-transfer-manager
como dependencia. -
Agregue el
aws-crt
artefacto como una dependencia en la versión0.20.3
o superior.
En el ejemplo de código siguiente se muestra cómo configurar las dependencias de su proyecto para Maven.
<project> <properties> <aws.sdk.version>
2.19.1
</aws.sdk.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.20.3
</version> </dependency> </dependencies> </project>
Busque en el repositorio central de Maven las versiones más recientes de los artefactos s3-transfer-manager
Crear una instancia del S3 Transfer Manager
En el siguiente fragmento se muestra cómo crear una TransferManager instancia S3
S3TransferManager transferManager = S3TransferManager.create();
El ejemplo siguiente muestra cómo configurar un S3 Transfer Manager con ajustes personalizados. En este ejemplo, se utiliza una AsyncClient instancia S3 AWS CRT basada como cliente subyacente para S3 Transfer Manager.
S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * MB) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();
nota
Si la aws-crt
dependencia no está incluida en el archivo de compilación, el S3 Transfer Manager se basa en el cliente asíncrono S3 estándar que se utiliza en la versión 2.x SDK para Java.
Cargar un archivo en un bucket de S3
El siguiente ejemplo muestra un ejemplo de carga de archivos junto con el uso opcional de a LoggingTransferListener
Para cargar un archivo en Amazon S3 mediante el S3 Transfer Manager, pase un UploadFileRequest
S3TransferManager
uploadFile
El FileUploaduploadFile
método representa el proceso de carga. Una vez finalizada la solicitud, el CompletedFileUpload
public String uploadFile(S3TransferManager transferManager, String bucketName, String key, URI filePathURI) { UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b.bucket(bucketName).key(key)) .source(Paths.get(filePathURI)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); return uploadResult.response().eTag(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Paths; import java.util.UUID;
Descargar un archivo de un bucket de S3
El siguiente ejemplo muestra un ejemplo de descarga junto con el uso opcional de un LoggingTransferListener
Para descargar un objeto de un bucket de S3 mediante el S3 Transfer Manager, cree un DownloadFileRequest
El FileDownloaddownloadFile
método S3TransferManager
's representa la transferencia de archivos. Una vez completada la descarga, CompletedFileDownload
public Long downloadFile(S3TransferManager transferManager, String bucketName, String key, String downloadedFileWithPath) { DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(b -> b.bucket(bucketName).key(key)) .destination(Paths.get(downloadedFileWithPath)) .build(); FileDownload downloadFile = transferManager.downloadFile(downloadFileRequest); CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); logger.info("Content length [{}]", downloadResult.response().contentLength()); return downloadResult.response().contentLength(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload; import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest; import software.amazon.awssdk.transfer.s3.model.FileDownload; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.UUID;
Copiar un objeto de Amazon S3 a otro bucket
En el siguiente ejemplo se muestra cómo copiar un objeto con S3 Transfer Manager.
Para empezar a copiar un objeto de un bucket de S3 a otro bucket, cree una CopyObjectRequest
A continuación, incluya la básica CopyObjectRequest
en una CopyRequest
El objeto Copy
devuelto por el método copy
de S3TransferManager
representa el proceso de copia. Una vez finalizado el proceso de copia, el CompletedCopy
public String copyObject(S3TransferManager transferManager, String bucketName, String key, String destinationBucket, String destinationKey) { CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder() .sourceBucket(bucketName) .sourceKey(key) .destinationBucket(destinationBucket) .destinationKey(destinationKey) .build(); CopyRequest copyRequest = CopyRequest.builder() .copyObjectRequest(copyObjectRequest) .build(); Copy copy = transferManager.copy(copyRequest); CompletedCopy completedCopy = copy.completionFuture().join(); return completedCopy.response().copyObjectResult().eTag(); }
nota
Para realizar una copia entre regiones con el administrador de transferencias de S3, habilítelo crossRegionAccessEnabled
en el generador de clientes S3 AWS CRT basado en él, tal como se muestra en el siguiente fragmento.
S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .crossRegionAccessEnabled(true) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.CopyObjectRequest; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedCopy; import software.amazon.awssdk.transfer.s3.model.Copy; import software.amazon.awssdk.transfer.s3.model.CopyRequest; import java.util.UUID;
Cargar un directorio local en un bucket de S3
En el siguiente ejemplo se muestra cómo se puede cargar un directorio local en S3.
Comience por llamar al uploadDirectoryS3TransferManager
instancia, pasando un. UploadDirectoryRequest
El DirectoryUploadCompleteDirectoryUpload
contiene información sobre los resultados de la transferencia, incluidos los archivos que no se pudieron transferir.
public Integer uploadDirectory(S3TransferManager transferManager, URI sourceDirectory, String bucketName) { DirectoryUpload directoryUpload = transferManager.uploadDirectory(UploadDirectoryRequest.builder() .source(Paths.get(sourceDirectory)) .bucket(bucketName) .build()); CompletedDirectoryUpload completedDirectoryUpload = directoryUpload.completionFuture().join(); completedDirectoryUpload.failedTransfers() .forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryUpload.failedTransfers().size(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryUpload; import software.amazon.awssdk.transfer.s3.model.DirectoryUpload; import software.amazon.awssdk.transfer.s3.model.UploadDirectoryRequest; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Paths; import java.util.UUID;
Descargar objetos de bucket S3 en un directorio local
Puede descargar los objetos de un bucket S3 en un directorio local tal y como se muestra en el siguiente ejemplo.
Para descargar los objetos de un bucket de S3 a un directorio local, comience por llamar al downloadDirectory
El DirectoryDownloadCompleteDirectoryDownload
contiene información sobre los resultados de la transferencia, incluidos los archivos que no se pudieron transferir.
public Integer downloadObjectsToDirectory(S3TransferManager transferManager, URI destinationPathURI, String bucketName) { DirectoryDownload directoryDownload = transferManager.downloadDirectory(DownloadDirectoryRequest.builder() .destination(Paths.get(destinationPathURI)) .bucket(bucketName) .build()); CompletedDirectoryDownload completedDirectoryDownload = directoryDownload.completionFuture().join(); completedDirectoryDownload.failedTransfers() .forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryDownload.failedTransfers().size(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DownloadDirectoryRequest; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors;
Vea ejemplos completos
GitHub contiene el código completo