Transférez des fichiers et des répertoires avec Amazon S3 Transfer Manager - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Transférez des fichiers et des répertoires avec Amazon S3 Transfer Manager

Amazon S3 Transfer Manager est un utilitaire de transfert de fichiers open source de haut niveau pour AWS SDK for Java 2.x. Utilisez-le pour transférer des fichiers et des répertoires depuis et vers Amazon Simple Storage Service (Amazon S3).

Lorsqu'il est construit sur le client S3 AWS CRT basé sur le client S3, le gestionnaire de transfert S3 peut tirer parti des améliorations de performances telles que le téléchargement partitionné API et les extractions par plage d'octets.

Avec le gestionnaire de transfert S3, vous pouvez également suivre la progression d'un transfert en temps réel et le suspendre pour une exécution ultérieure.

Mise en route

Ajoutez des dépendances à votre fichier de compilation

Pour utiliser le gestionnaire de transfert S3 avec des performances améliorées basées sur le client S3 AWS CRT basé sur le client S3, configurez votre fichier de build avec les dépendances suivantes.

  • Utiliser la version 2.19.1 ou supérieur à celui SDK pour Java 2.x.

  • Ajoutez l's3-transfer-managerartefact en tant que dépendance.

  • Ajoutez l'aws-crtartefact en tant que dépendance lors de la version 0.20.3 ou supérieur.

L'exemple de code suivant montre comment configurer les dépendances de votre projet pour 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>

Recherchez dans le référentiel central Maven les versions les plus récentes des artefacts s3-transfer-manager et aws-crt.

Création d'une instance du gestionnaire de transfert S3

L'extrait suivant montre comment créer une TransferManager instance S3 avec les paramètres par défaut.

S3TransferManager transferManager = S3TransferManager.create();

L'exemple suivant montre comment configurer un gestionnaire de transfert S3 avec des paramètres personnalisés. Dans cet exemple, une AsyncClient instance AWS CRTbasée sur S3 est utilisée comme client sous-jacent pour le gestionnaire de transfert S3.

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();
Note

Si la aws-crt dépendance n'est pas incluse dans le fichier de compilation, le gestionnaire de transfert S3 est construit sur le client asynchrone S3 standard utilisé dans la version 2.x SDK pour Java.

Charger un fichier dans un compartiment S3

L'exemple suivant montre un exemple de téléchargement de fichier ainsi que l'utilisation facultative de a LoggingTransferListener, qui enregistre la progression du téléchargement.

Pour charger un fichier sur Amazon S3 à l'aide du gestionnaire de transfert S3, transmettez un UploadFileRequestobjet à la uploadFileméthode S3TransferManager's.

L'FileUploadobjet renvoyé par la uploadFile méthode représente le processus de téléchargement. Une fois la demande terminée, l'CompletedFileUploadobjet contient des informations sur le téléchargement.

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;

Télécharger un fichier depuis un compartiment S3

L'exemple suivant montre un exemple de téléchargement ainsi que l'utilisation facultative de a LoggingTransferListener, qui enregistre la progression du téléchargement.

Pour télécharger un objet depuis un compartiment S3 à l'aide du gestionnaire de transfert S3, créez un DownloadFileRequestobjet et transmettez-le à la downloadFileméthode.

L'FileDownloadobjet renvoyé par la downloadFile méthode S3TransferManager's représente le transfert de fichier. Une fois le téléchargement terminé, il CompletedFileDownloadcontient l'accès aux informations relatives au téléchargement.

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;

Copier un objet Amazon S3 dans un autre compartiment

L'exemple suivant montre comment copier un objet avec le gestionnaire de transfert S3.

Pour commencer à copier un objet d'un compartiment S3 vers un autre compartiment, créez une CopyObjectRequestinstance de base.

Ensuite, insérez les éléments de base CopyObjectRequest dans un CopyRequestfichier utilisable par le gestionnaire de transfert S3.

L'Copyobjet renvoyé par la copy méthode S3TransferManager's représente le processus de copie. Une fois le processus de copie terminé, l'CompletedCopyobjet contient les détails de la réponse.

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(); }
Note

Pour effectuer une copie entre régions avec le gestionnaire de transfert S3, activez-le crossRegionAccessEnabled sur le générateur de clients S3 AWS CRT basé sur S3, comme indiqué dans l'extrait suivant.

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;

Charger un répertoire local dans un compartiment S3

L'exemple suivant montre comment télécharger un répertoire local dans S3.

Commencez par appeler la uploadDirectoryméthode de l'S3TransferManagerinstance, en lui transmettant un UploadDirectoryRequest.

L'DirectoryUploadobjet représente le processus de téléchargement, qui génère un CompletedDirectoryUploadlorsque la demande est terminée. L'CompleteDirectoryUploadobjet contient des informations sur les résultats du transfert, notamment les fichiers qui n'ont pas pu être transférés.

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;

Télécharger des objets du compartiment S3 dans un répertoire local

Vous pouvez télécharger les objets d'un compartiment S3 dans un répertoire local, comme illustré dans l'exemple suivant.

Pour télécharger les objets d'un compartiment S3 vers un répertoire local, commencez par appeler la downloadDirectoryméthode du gestionnaire de transfert, en lui transmettant un DownloadDirectoryRequest.

L'DirectoryDownloadobjet représente le processus de téléchargement, qui génère un CompletedDirectoryDownloadlorsque la demande est terminée. L'CompleteDirectoryDownloadobjet contient des informations sur les résultats du transfert, notamment les fichiers qui n'ont pas pu être transférés.

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;

Voir des exemples complets

GitHub contient le code complet pour tous les exemples de cette page.