Dateien und Verzeichnisse mit dem Amazon S3 Transfer Manager übertragen - AWS SDK for Java 2.x

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Dateien und Verzeichnisse mit dem Amazon S3 Transfer Manager übertragen

Der Amazon S3 Transfer Manager ist ein Open-Source-Hilfsprogramm zur Dateiübertragung auf hohem Niveau für AWS SDK for Java 2.x. Verwenden Sie es, um Dateien und Verzeichnisse zu und von Amazon Simple Storage Service (Amazon S3) zu übertragen.

Wenn der S3 Transfer Manager auf dem S3-Client AWS CRT basiert, kann er Leistungsverbesserungen wie den mehrteiligen Upload API und Abrufe im Bytebereich nutzen.

Mit dem S3 Transfer Manager können Sie auch den Fortschritt einer Übertragung in Echtzeit überwachen und die Übertragung für eine spätere Ausführung unterbrechen.

Erste Schritte

Fügen Sie Ihrer Build-Datei Abhängigkeiten hinzu

Um den S3 Transfer Manager mit verbesserter Leistung auf der Grundlage des AWS CRT basierten S3-Clients zu verwenden, konfigurieren Sie Ihre Build-Datei mit den folgenden Abhängigkeiten.

  • Version verwenden 2.19.1 oder höher von SDK für Java 2.x.

  • Fügen Sie das s3-transfer-manager Artefakt als Abhängigkeit hinzu.

  • Fügen Sie das aws-crt Artefakt als Abhängigkeit zur Version hinzu 0.20.3 oder höher.

Das folgende Codebeispiel zeigt, wie Sie Ihre Projektabhängigkeiten für Maven konfigurieren.

<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>

Suchen Sie im zentralen Maven-Repository nach den neuesten Versionen der Artefakte s3-Transfer-Manager und aws-crt.

Erstellen Sie eine Instanz des S3 Transfer Managers

Der folgende Ausschnitt zeigt, wie Sie eine TransferManagerS3-Instanz mit Standardeinstellungen erstellen.

S3TransferManager transferManager = S3TransferManager.create();

Das folgende Beispiel zeigt, wie Sie einen S3 Transfer Manager mit benutzerdefinierten Einstellungen konfigurieren. In diesem Beispiel wird eine AWS CRTbasierte AsyncClient S3-Instanz als zugrundeliegender Client für den S3 Transfer Manager verwendet.

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

Wenn die aws-crt Abhängigkeit nicht in der Build-Datei enthalten ist, baut der S3 Transfer Manager auf dem standardmäßigen asynchronen S3-Client auf, der SDK in Java 2.x verwendet wird.

Laden Sie eine Datei in einen S3-Bucket hoch

Das folgende Beispiel zeigt ein Beispiel für den Datei-Upload zusammen mit der optionalen Verwendung von a LoggingTransferListener, das den Fortschritt des Uploads protokolliert.

Um eine Datei mit dem S3 Transfer Manager auf Amazon S3 hochzuladen, übergeben Sie ein UploadFileRequestObjekt an S3TransferManager die uploadFileMethode.

Das von der uploadFile Methode zurückgegebene FileUploadObjekt repräsentiert den Upload-Vorgang. Nach Abschluss der Anfrage enthält das CompletedFileUploadObjekt Informationen über den Upload.

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;

Laden Sie eine Datei aus einem S3-Bucket herunter

Das folgende Beispiel zeigt ein Download-Beispiel zusammen mit der optionalen Verwendung von a LoggingTransferListener, das den Fortschritt des Downloads protokolliert.

Um ein Objekt mit dem S3 Transfer Manager aus einem S3-Bucket herunterzuladen, erstellen Sie ein DownloadFileRequestObjekt und übergeben es an die downloadFileMethode.

Das von der S3TransferManager downloadFile Methode zurückgegebene FileDownloadObjekt stellt die Dateiübertragung dar. Nach Abschluss des Downloads CompletedFileDownloadenthält der Zugriff auf Informationen über den Download.

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;

Ein Amazon S3 S3-Objekt in einen anderen Bucket kopieren

Das folgende Beispiel zeigt, wie ein Objekt mit dem S3 Transfer Manager kopiert wird.

Um mit dem Kopieren eines Objekts von einem S3-Bucket in einen anderen Bucket zu beginnen, erstellen Sie eine CopyObjectRequestBasisinstanz.

Verpacken Sie als Nächstes die Basisdatei CopyObjectRequest in eine CopyRequest, die vom S3 Transfer Manager verwendet werden kann.

Das von der S3TransferManager copy Methode zurückgegebene Copy Objekt stellt den Kopiervorgang dar. Nach Abschluss des Kopiervorgangs enthält das CompletedCopyObjekt Details zur Antwort.

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

Um eine regionsübergreifende Kopie mit dem S3 Transfer Manager durchzuführen, aktivieren Sie die Option crossRegionAccessEnabled auf dem AWS CRT S3-Client-Builder, wie im folgenden Codeausschnitt gezeigt.

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;

Laden Sie ein lokales Verzeichnis in einen S3-Bucket hoch

Das folgende Beispiel zeigt, wie Sie ein lokales Verzeichnis auf S3 hochladen können.

Rufen Sie zunächst die uploadDirectoryMethode der S3TransferManager Instanz auf und übergeben Sie eine UploadDirectoryRequest.

Das DirectoryUploadObjekt stellt den Upload-Vorgang dar, der nach CompletedDirectoryUploadAbschluss der Anfrage eine generiert. Das CompleteDirectoryUpload Objekt enthält Informationen über die Ergebnisse der Übertragung, einschließlich der Dateien, die nicht übertragen werden konnten.

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;

Laden Sie S3-Bucket-Objekte in ein lokales Verzeichnis herunter

Sie können die Objekte in einem S3-Bucket in ein lokales Verzeichnis herunterladen, wie im folgenden Beispiel gezeigt.

Um die Objekte in einem S3-Bucket in ein lokales Verzeichnis herunterzuladen, rufen Sie zunächst die downloadDirectoryMethode des Transfer Managers auf und übergeben Sie eine DownloadDirectoryRequest.

Das DirectoryDownloadObjekt stellt den Download-Vorgang dar, der nach CompletedDirectoryDownloadAbschluss der Anfrage eine generiert. Das CompleteDirectoryDownload Objekt enthält Informationen über die Ergebnisse der Übertragung, einschließlich der Dateien, die nicht übertragen werden konnten.

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;

Vollständige Beispiele anzeigen

GitHub enthält den vollständigen Code für alle Beispiele auf dieser Seite.