Trasferisci file e directory con Amazon S3 Transfer Manager - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Trasferisci file e directory con Amazon S3 Transfer Manager

Amazon S3 Transfer Manager è un'utilità di trasferimento di file open source di alto livello per. AWS SDK for Java 2.x Usalo per trasferire file e directory da e verso Amazon Simple Storage Service (Amazon S3).

Se basato sul client S3 AWS basato su CRT o sul client asincrono S3standard basato su Java con multipart abilitato, S3 Transfer Manager può sfruttare i miglioramenti delle prestazioni come l'API di caricamento multiparte e il recupero di intervalli di byte.

Con S3 Transfer Manager, puoi anche monitorare l'avanzamento di un trasferimento in tempo reale e mettere in pausa il trasferimento per un'esecuzione successiva.

Inizia a usare

Aggiungi dipendenze al tuo file di build

Per utilizzare S3 Transfer Manager con prestazioni multiparte migliorate, configura il file di build con le dipendenze necessarie.

Use the AWS CRT-based S3 client
<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>

1 Ultima versione. 2 Ultima versione.

Use the Java-based S3 async client
<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> </dependencies>

1 Ultima versione.

Crea un'istanza di S3 Transfer Manager

Per abilitare il trasferimento parallelo, è necessario passare un client S3 AWS basato su CRT OPPURE un client asincrono S3 basato su Java con multipart abilitato. Gli esempi seguenti mostrano come configurare un S3 Transfer Manager con impostazioni personalizzate.

Use the AWS CRT-based S3 client
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();
Use the Java-based S3 async client

Se la aws-crt dipendenza non è inclusa nel file di build, S3 Transfer Manager si basa sul client asincrono S3 standard basato su Java utilizzato nell'SDK for Java 2.x.

Configurazione personalizzata del client S3: richiede l'attivazione di più parti

S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .multipartEnabled(true) .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();

Nessuna configurazione del client S3: supporto multiparte abilitato automaticamente

S3TransferManager transferManager = S3TransferManager.create();

Carica un file in un bucket S3

L'esempio seguente mostra un esempio di caricamento di file insieme all'uso opzionale di a LoggingTransferListener, che registra l'avanzamento del caricamento.

Per caricare un file su Amazon S3 utilizzando S3 Transfer Manager, passa un UploadFileRequestoggetto al S3TransferManager metodo uploadFile.

L'FileUploadoggetto restituito dal uploadFile metodo rappresenta il processo di caricamento. Al termine della richiesta, l'CompletedFileUploadoggetto contiene informazioni sul caricamento.

public void trackUploadFile(S3TransferManager transferManager, String bucketName, String key, URI filePathURI) { UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b.bucket(bucketName).key(key)) .addTransferListener(LoggingTransferListener.create()) // Add listener. .source(Paths.get(filePathURI)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); fileUpload.completionFuture().join(); /* The SDK provides a LoggingTransferListener implementation of the TransferListener interface. You can also implement the interface to provide your own logic. Configure log4J2 with settings such as the following. <Configuration status="WARN"> <Appenders> <Console name="AlignedConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%m%n"/> </Console> </Appenders> <Loggers> <logger name="software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener" level="INFO" additivity="false"> <AppenderRef ref="AlignedConsoleAppender"/> </logger> </Loggers> </Configuration> Log4J2 logs the progress. The following is example output for a 21.3 MB file upload. Transfer initiated... | | 0.0% |==== | 21.1% |============ | 60.5% |====================| 100.0% Transfer complete! */ }
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;

Scarica un file da un bucket S3

L'esempio seguente mostra un esempio di download insieme all'uso opzionale di a LoggingTransferListener, che registra l'avanzamento del download.

Per scaricare un oggetto da un bucket S3 utilizzando S3 Transfer Manager, crea un DownloadFileRequestoggetto e passalo al metodo DownloadFile.

L'FileDownloadoggetto restituito dal downloadFile metodo S3TransferManager's rappresenta il trasferimento del file. Una volta completato il download, CompletedFileDownloadcontiene l'accesso alle informazioni sul download.

public void trackDownloadFile(S3TransferManager transferManager, String bucketName, String key, String downloadedFileWithPath) { DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(b -> b.bucket(bucketName).key(key)) .addTransferListener(LoggingTransferListener.create()) // Add listener. .destination(Paths.get(downloadedFileWithPath)) .build(); FileDownload downloadFile = transferManager.downloadFile(downloadFileRequest); CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); /* The SDK provides a LoggingTransferListener implementation of the TransferListener interface. You can also implement the interface to provide your own logic. Configure log4J2 with settings such as the following. <Configuration status="WARN"> <Appenders> <Console name="AlignedConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%m%n"/> </Console> </Appenders> <Loggers> <logger name="software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener" level="INFO" additivity="false"> <AppenderRef ref="AlignedConsoleAppender"/> </logger> </Loggers> </Configuration> Log4J2 logs the progress. The following is example output for a 21.3 MB file download. Transfer initiated... |======= | 39.4% |=============== | 78.8% |====================| 100.0% Transfer complete! */ }
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;

Copiare un oggetto Amazon S3 in un altro bucket

L'esempio seguente mostra come copiare un oggetto con S3 Transfer Manager.

Per iniziare la copia di un oggetto da un bucket S3 a un altro bucket, crea un'istanza di base. CopyObjectRequest

Successivamente, racchiudi il file di base CopyObjectRequest in un file CopyRequestche possa essere utilizzato da S3 Transfer Manager.

L'Copyoggetto restituito dal copy metodo S3TransferManager's rappresenta il processo di copia. Una volta completato il processo di copia, l'CompletedCopyoggetto contiene i dettagli sulla risposta.

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

Per eseguire una copia su più regioni con S3 Transfer Manager, abilitalo sul generatore di client S3 AWS basato crossRegionAccessEnabled su CRT, come mostrato nel frammento seguente.

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;

Carica una directory locale in un bucket S3

L'esempio seguente mostra come caricare una directory locale su S3.

Inizia chiamando il metodo uploadDirectory dell'S3TransferManageristanza, passando un. UploadDirectoryRequest

L'DirectoryUploadoggetto rappresenta il processo di caricamento, che genera un al CompletedDirectoryUploadtermine della richiesta. L'CompleteDirectoryUploadoggetto contiene informazioni sui risultati del trasferimento, inclusi i file non riusciti a trasferire.

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;

Scarica gli oggetti del bucket S3 in una directory locale

Puoi scaricare gli oggetti in un bucket S3 in una directory locale come mostrato nell'esempio seguente.

Per scaricare gli oggetti in un bucket S3 in una directory locale, iniziate chiamando il metodo DownloadDirectory di Transfer Manager, passando un. DownloadDirectoryRequest

L'DirectoryDownloadoggetto rappresenta il processo di download, che genera un messaggio CompletedDirectoryDownloadquando la richiesta viene completata. L'CompleteDirectoryDownloadoggetto contiene informazioni sui risultati del trasferimento, inclusi i file non riusciti a trasferire.

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;

Vedi esempi completi

GitHub contiene il codice completo per tutti gli esempi in questa pagina.