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-manager
artefact en tant que dépendance. -
Ajoutez l'
aws-crt
artefact en tant que dépendance lors de la version0.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
Création d'une instance du gestionnaire de transfert S3
L'extrait suivant montre comment créer une TransferManager instance S3
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
Pour charger un fichier sur Amazon S3 à l'aide du gestionnaire de transfert S3, transmettez un UploadFileRequest
S3TransferManager
's.
L'FileUploaduploadFile
méthode représente le processus de téléchargement. Une fois la demande terminée, l'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;
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
Pour télécharger un objet depuis un compartiment S3 à l'aide du gestionnaire de transfert S3, créez un DownloadFileRequest
L'FileDownloaddownloadFile
méthode S3TransferManager
's représente le transfert de fichier. Une fois le téléchargement terminé, il 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;
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 CopyObjectRequest
Ensuite, insérez les éléments de base CopyObjectRequest
dans un CopyRequest
L'Copy
objet renvoyé par la copy
méthode S3TransferManager
's représente le processus de copie. Une fois le processus de copie terminé, l'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(); }
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 uploadDirectoryS3TransferManager
instance, en lui transmettant un UploadDirectoryRequest
L'DirectoryUploadCompleteDirectoryUpload
objet 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 downloadDirectory
L'DirectoryDownloadCompleteDirectoryDownload
objet 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