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.
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 basé sur CRT ou sur le client asynchrone S3standard basé sur Java avec le multipart activé, le gestionnaire de transfert S3 peut tirer parti des améliorations de performances telles que l'API de téléchargement en plusieurs parties 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 multiparties améliorées, configurez votre fichier de build avec les dépendances nécessaires.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.27.211
</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.29.1432
</version>
</dependency>
</dependencies>
Création d'une instance du gestionnaire de transfert S3
Pour activer le transfert parallèle, vous devez transmettre un client S3 AWS basé sur CRT OU un client asynchrone S3 basé sur Java avec le multipart activé. Les exemples suivants montrent comment configurer un gestionnaire de transfert S3 avec des paramètres personnalisés.
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();
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
la méthode uploadFile
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 basé sur CRT, 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 méthode 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 méthode 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