Mehrteilige Uploads in Amazon S3 mit Java

Multipart-Uploads in Amazon S3 mit Java

1. Überblick

In diesem Tutorial erfahren Sie, wie Sie mehrteilige Uploads in Amazon S3 mit AWS Java SDK verarbeiten.

Simply put, in a multipart upload, we split the content into smaller parts and upload each part individually. Alle Teile werden beim Empfang wieder zusammengebaut.

Multipart-Uploads bieten folgende Vorteile:

  • Höherer Durchsatz - wir können Teile parallel hochladen

  • Einfachere Fehlerbehebung - Wir müssen nur die fehlerhaften Teile erneut hochladen

  • Uploads anhalten und fortsetzen - wir können Teile jederzeit hochladen. Der gesamte Vorgang kann angehalten und die verbleibenden Teile können später hochgeladen werden

Beachten Sie, dass bei Verwendung eines mehrteiligen Uploadswith Amazon S3, each part except the last part must be at least 5 MB in size.

2. Maven-Abhängigkeiten

Bevor wir beginnen, müssen wir die AWS SDK-Abhängigkeit in unser Projekt einfügen:


    com.amazonaws
    aws-java-sdk
    1.11.290

Überprüfen SieMaven Central, um die neueste Version anzuzeigen.

3. Durchführen eines mehrteiligen Uploads

3.1. Amazon S3-Client erstellen

Zuerst müssen wircreate a client for accessing Amazon S3. verwenden. Wir werden dieAmazonS3ClientBuilder für diesen Zweck verwenden:

AmazonS3 amazonS3 = AmazonS3ClientBuilder
  .standard()
  .withCredentials(new DefaultAWSCredentialsProviderChain())
  .withRegion(Regions.DEFAULT_REGION)
  .build();

Auf diese Weise wird ein Client erstellt, der die standardmäßige Anbieterkette für Anmeldeinformationen für den Zugriff auf AWS-Anmeldeinformationen verwendet.

Weitere Informationen zur Funktionsweise der Standardkette für Anbieter von Anmeldeinformationen finden Sie unterthe documentation. Wenn Sie eine andere Region als die Standardregion (US West-2) verwenden, stellen Sie sicher, dass SieRegions.DEFAULT_REGION durch diese benutzerdefinierte Region ersetzen.

3.2. Erstellen von TransferManager zum Verwalten von Uploads

Wir werdenTransferManagerBuilder verwenden, um eineTransferManager-Instanz zu erstellen.

Diese Klasseprovides simple APIs to manage uploads and downloads with Amazon S3 und verwaltet alle zugehörigen Aufgaben:

TransferManager tm = TransferManagerBuilder.standard()
  .withS3Client(amazonS3)
  .withMultipartUploadThreshold((long) (5 * 1024 * 1025))
  .build();

Der Schwellenwert für mehrteilige Uploads gibt die Größe in Byte an, über der der Upload als mehrteiliger Upload ausgeführt werden soll.

In Amazon S3 ist eine minimale Teilegröße von 5 MB (für andere Teile als das letzte Teil) festgelegt. Daher haben wir 5 MB als Schwellenwert für das Hochladen von mehreren Teilen verwendet.

3.3. Objekt hochladen

To upload object using TransferManager we simply need to call its upload() function. Dies lädt die Teile parallel hoch:

String bucketName = "example-bucket";
String keyName = "my-picture.jpg";
String file = new File("documents/my-picture.jpg");
Upload upload = tm.upload(bucketName, keyName, file);

TransferManager.upload() gibt einUpload-Objekt zurück. Dies kann verwendet werden, um den Status von Uploads zu überprüfen und diese zu verwalten. Wir werden dies im nächsten Abschnitt tun.

3.4. Warten auf den Abschluss des Uploads

TransferManager.upload() is a non-blocking function; Es wird sofort zurückgegeben, während der Upload im Hintergrund ausgeführt wird.

Wir könnenuse the returned Upload object to wait for the upload to complete vor dem Beenden des Programms:

try {
    upload.waitForCompletion();
} catch (AmazonClientException e) {
    // ...
}

3.5. Verfolgen des Upload-Fortschritts

Das Verfolgen des Fortschritts des Uploads ist eine häufige Anforderung. Wir können das mit Hilfe einerProgressListener-Instanz tun:

ProgressListener progressListener = progressEvent -> System.out.println(
  "Transferred bytes: " + progressEvent.getBytesTransferred());
PutObjectRequest request = new PutObjectRequest(
  bucketName, keyName, file);
request.setGeneralProgressListener(progressListener);
Upload upload = tm.upload(request);

Die von uns erstelltenProgressListener drucken einfach die Anzahl der übertragenen Bytes weiter, bis der Upload abgeschlossen ist.

3.6. Steuern der Upload-Parallelität

Standardmäßig verwendetTransferManager maximal zehn Threads, um mehrteilige Uploads durchzuführen.

Wir können dies jedoch steuern, indem wirExecutorService angeben, währendTransferManager erstellt werden:

int maxUploadThreads = 5;
TransferManager tm = TransferManagerBuilder.standard()
  .withS3Client(amazonS3)
  .withMultipartUploadThreshold((long) (5 * 1024 * 1025))
  .withExecutorFactory(() -> Executors.newFixedThreadPool(maxUploadThreads))
  .build();

Hier haben wir ein Lambda zum Erstellen einer Wrapper-Implementierung vonExecutorFactory verwendet und es an die FunktionwithExecutorFactory() übergeben.

4. Fazit

In diesem kurzen Artikel haben wir gelernt, wie Sie mit AWS SDK für Java Uploads mit mehreren Teilen durchführen und wie Sie einige Aspekte des Uploads steuern und den Fortschritt verfolgen.

Wie immer ist der vollständige Code dieses Artikelsover on GitHub verfügbar.