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 AWS CRT basierten S3-Client oder dem standardmäßigen Java-basierten asynchronen S3-Client mit aktiviertem Multipart aufbaut, kann er Leistungsverbesserungen wie den mehrteiligen Upload und das Abrufen von Bytebereichen nutzen. API

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 Mehrteile-Leistung zu verwenden, konfigurieren Sie Ihre Build-Datei mit den erforderlichen Abhängigkeiten.

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 Letzte Version. 2 Letzte Version.

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 Letzte Version.

Erstellen Sie eine Instanz des S3 Transfer Managers

Um die parallel Übertragung zu aktivieren, müssen Sie einen AWS CRT basierten S3-Client ODER einen Java-basierten asynchronen S3-Client mit aktiviertem Multipart übergeben. Die folgenden Beispiele zeigen, wie Sie einen S3 Transfer Manager mit benutzerdefinierten Einstellungen konfigurieren.

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

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

Benutzerdefinierte Konfiguration des S3-Clients — Multipart muss aktiviert sein

S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .multipartEnabled(true) .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * MB) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();

Keine Konfiguration des S3-Clients — Multipart-Support wird automatisch aktiviert

S3TransferManager transferManager = S3TransferManager.create();

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 repräsentiert den Kopiervorgang. 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.