Meerdelige uploads in Amazon S3 met Java

1. Overzicht

In deze zelfstudie zullen we zien hoe u meervoudige uploads in Amazon S3 kunt afhandelen met AWS Java SDK.

Simpel gezegd, in een meervoudige upload splitsen we de inhoud op in kleinere delen en uploaden we elk deel afzonderlijk. Alle onderdelen worden bij ontvangst weer in elkaar gezet.

Meerdelige uploads bieden de volgende voordelen:

  • Hogere doorvoer - we kunnen onderdelen parallel uploaden
  • Gemakkelijker foutherstel - we hoeven alleen de defecte onderdelen opnieuw te uploaden
  • Pauzeer en hervat uploads - we kunnen delen op elk moment uploaden. Het hele proces kan worden gepauzeerd en de resterende delen kunnen later worden geüpload

Houd er rekening mee dat bij gebruik van meerdelige upload bij Amazon S3 moet elk onderdeel behalve het laatste deel minstens 5 MB groot zijn.

2. Maven afhankelijkheden

Voordat we beginnen, moeten we de AWS SDK-afhankelijkheid aan ons project toevoegen:

 com.amazonaws aws-java-sdk 1.11.290 

Ga naar Maven Central om de nieuwste versie te bekijken.

3. Meerdelige upload uitvoeren

3.1. Amazon S3-client maken

Ten eerste moeten we maak een client aan voor toegang tot Amazon S3. We gebruiken de AmazonS3ClientBuilder Voor dit doeleinde:

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

Hierdoor wordt een client gemaakt met behulp van de standaardketen van de credentialprovider voor toegang tot AWS-inloggegevens.

Raadpleeg de documentatie voor meer informatie over hoe de standaardketen van inloggegevensproviders werkt. Als u een andere regio gebruikt dan de standaardregio (US West-2), zorg ervoor dat u deze vervangt Regions.DEFAULT_REGION met die aangepaste regio.

3.2. TransferManager maken voor het beheren van uploads

We zullen gebruiken TransferManagerBuilder om een TransferManager voorbeeld.

Deze klas biedt eenvoudige API's om uploads en downloads te beheren met Amazon S3 en beheert alle gerelateerde taken:

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

Meerdelige uploaddrempel specificeert de grootte, in bytes, waarboven de upload moet worden uitgevoerd als meerdelige upload.

Amazon S3 legt een minimale deelgrootte op van 5 MB (voor andere delen dan het laatste deel), dus hebben we 5 MB gebruikt als drempelwaarde voor het uploaden van meerdere delen.

3.3. Object uploaden

Om een ​​object te uploaden met TransferManager we hoeven alleen maar haar te bellen uploaden() functie. Dit uploadt de onderdelen parallel:

String bucketName = "baeldung-bucket"; String keyName = "mijn-afbeelding.jpg"; String-bestand = nieuw bestand ("documenten / mijn-afbeelding.jpg"); Upload upload = tm.upload (bucketName, keyName, file);

TransferManager.upload () geeft een Uploaden voorwerp. Dit kan worden gebruikt om de status van uploads te controleren en deze te beheren. We zullen dit in de volgende sectie doen.

3.4. Wachten tot uploaden is voltooid

TransferManager.upload () is een niet-blokkerende functie; het keert onmiddellijk terug terwijl de upload op de achtergrond wordt uitgevoerd.

Wij kunnen gebruik de geretourneerde Uploaden object om te wachten tot het uploaden is voltooid voordat u het programma verlaat:

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

3.5. De voortgang van het uploaden volgen

Het bijhouden van de voortgang van het uploaden is een vrij algemene vereiste; we kunnen dat doen met behulp van een P.rogressListener voorbeeld:

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

De ProgressListener die we hebben gemaakt, zal gewoon doorgaan met het afdrukken van het aantal overgedragen bytes totdat de upload is voltooid.

3.6. Parallellisme bij uploaden beheren

Standaard, TransferManager gebruikt maximaal tien threads om uploads uit meerdere delen uit te voeren.

We kunnen dit echter beheersen door een ExecutorService tijdens het bouwen TransferManager:

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

Hier hebben we een lambda gebruikt voor het maken van een wrapper-implementatie van ExecutorFactory en gaf het door aan metExecutorFactory () functie.

4. Conclusie

In dit korte artikel hebben we geleerd hoe we uploads uit meerdere delen kunnen uitvoeren met AWS SDK voor Java, en we hebben gezien hoe we enkele aspecten van het uploaden kunnen beheren en de voortgang ervan kunnen bijhouden.

Zoals altijd is de volledige code van dit artikel beschikbaar op GitHub.