Mehrteilige Uploads in Amazon S3 mit Java

1. Übersicht

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

Einfach ausgedrückt, bei einem mehrteiligen Upload teilen wir den Inhalt in kleinere Teile auf und laden jeden Teil einzeln hoch. Alle Teile werden nach Erhalt wieder zusammengebaut.

Mehrteilige Uploads bieten folgende Vorteile:

  • Höherer Durchsatz - wir können Teile parallel hochladen
  • Einfachere Fehlerbehebung - Wir müssen nur die ausgefallenen Teile erneut hochladen
  • Uploads anhalten und fortsetzen - wir können Teile jederzeit hochladen. Der gesamte Vorgang kann angehalten werden und verbleibende Teile können später hochgeladen werden

Beachten Sie, dass bei Verwendung des mehrteiligen Uploads mit Amazon S3 jedes Teil mit Ausnahme des letzten Teils mindestens 5 MB groß sein muss.

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 

Schauen Sie sich Maven Central an, um die neueste Version anzuzeigen.

3. Durchführen eines mehrteiligen Uploads

3.1. Amazon S3-Client erstellen

Zunächst müssen wir einen Client für den Zugriff auf Amazon S3 erstellen. Wir werden den AmazonS3ClientBuilder für diesen Zweck verwenden:

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

Dadurch wird ein Client erstellt, der die Standardkette für Anmeldeinformationen für den Zugriff auf AWS-Anmeldeinformationen verwendet.

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

3.2. Erstellen von TransferManager zum Verwalten von Uploads

Wir werden TransferManagerBuilder verwenden , um eine TransferManager- Instanz zu erstellen .

Diese Klasse bietet einfache APIs zum Verwalten von Uploads und Downloads mit Amazon S3 und verwaltet alle zugehörigen Aufgaben:

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

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

Amazon S3 legt eine Mindestteilegröße von 5 MB fest (für andere Teile als das letzte Teil). Daher haben wir 5 MB als mehrteiligen Upload-Schwellenwert verwendet.

3.3. Objekt hochladen

Um ein Objekt mit TransferManager hochzuladen, müssen Sie lediglich die Funktion upload () aufrufen . Dadurch werden die Teile parallel hochgeladen:

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

TransferManager.upload () gibt ein Upload- 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 () ist eine nicht blockierende Funktion . Es wird sofort zurückgegeben, während der Upload im Hintergrund ausgeführt wird.

Mit dem zurückgegebenen Upload- Objekt können wir warten, bis der Upload abgeschlossen ist, bevor wir das Programm beenden :

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 einer P rogressListener- 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);

Der von uns erstellte ProgressListener druckt einfach die Anzahl der übertragenen Bytes weiter, bis der Upload abgeschlossen ist.

3.6. Steuern der Upload-Parallelität

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

Wir können dies jedoch steuern, indem wir beim Erstellen von TransferManager einen ExecutorService angeben :

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 von ExecutorFactory verwendet und es an die Funktion withExecutorFactory () übergeben .

4. Fazit

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

Wie immer ist der vollständige Code dieses Artikels auf GitHub verfügbar.