Flerdelt opplastinger i Amazon S3 med Java

1. Oversikt

I denne veiledningen vil vi se hvordan du håndterer opplasting med flere deler i Amazon S3 med AWS Java SDK.

Enkelt sagt, i en flerdelt opplasting deler vi innholdet i mindre deler og laster opp hver del individuelt. Alle delene monteres på nytt når de mottas.

Opplasting med flere deler gir følgende fordeler:

  • Høyere gjennomstrømning - vi kan laste opp deler parallelt
  • Enklere feilgjenoppretting - vi må bare laste opp de mislykkede delene på nytt
  • Stopp og gjenopplasting på pause - vi kan laste opp deler når som helst. Hele prosessen kan settes på pause, og gjenværende deler kan lastes opp senere

Vær oppmerksom på at når du bruker opplasting med flere deler med Amazon S3, må hver del unntatt den siste delen ha minst 5 MB størrelse.

2. Maven-avhengigheter

Før vi begynner, må vi legge til AWS SDK-avhengighet i prosjektet vårt:

 com.amazonaws aws-java-sdk 1.11.290 

For å se den nyeste versjonen, sjekk ut Maven Central.

3. Utføre opplasting med flere deler

3.1. Opprette Amazon S3-klient

Først må vi opprette en klient for tilgang til Amazon S3. Vi bruker AmazonS3ClientBuilder for dette formålet:

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

Dette skaper en klient som bruker standard leverandørkjede for legitimasjon for tilgang til AWS-legitimasjon.

For mer informasjon om hvordan standard leverandørkjede for legitimasjon fungerer, se dokumentasjonen. Hvis du bruker en annen region enn standard (US West-2), sørg for at du bytter ut Regioner.DEFAULT_REGION med den egendefinerte regionen.

3.2. Opprette TransferManager for å administrere opplastinger

Vi bruker TransferManagerBuilder å lage en TransferManager forekomst.

Denne klassen gir enkle API-er for å administrere opplastinger og nedlastinger med Amazon S3 og administrerer alle relaterte oppgaver:

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

Flertallsopplastingsgrense angir størrelsen, i byte, over hvilken opplastingen skal utføres som flerdelt opplasting.

Amazon S3 pålegger en minimum delstørrelse på 5 MB (for andre deler enn siste del), så vi har brukt 5 MB som terskel for opplasting i flere deler.

3.3. Laster opp objekt

Å laste opp objekt ved hjelp av TransferManager vi trenger bare å kalle det laste opp() funksjon. Dette laster opp delene parallelt:

String bucketName = "baeldung-bucket"; String keyName = "my-picture.jpg"; Strengfil = ny fil ("dokumenter / min-bilde.jpg"); Last opp opplasting = tm.opplasting (bucketName, keyName, file);

TransferManager.upload () returnerer en Laste opp gjenstand. Dette kan brukes til å kontrollere status for og administrere opplastinger. Vi gjør det i neste avsnitt.

3.4. Venter på at opplastingen skal fullføres

TransferManager.upload () er en ikke-blokkerende funksjon; den returnerer umiddelbart mens opplastingen kjører i bakgrunnen.

Vi kan bruk den returnerte Laste opp mot å vente på at opplastingen er fullført før du avslutter programmet:

prøv {upload.waitForCompletion (); } fangst (AmazonClientException e) {// ...}

3.5. Spore opplastingsfremdriften

Spor fremdriften for opplastingen er ganske vanlig; vi kan gjøre det ved hjelp av a ProgressListener forekomst:

ProgressListener progressListener = progressEvent -> System.out.println ("Overførte byte:" + progressEvent.getBytesTransferred ()); PutObjectRequest-forespørsel = ny PutObjectRequest (bucketName, keyName, file); request.setGeneralProgressListener (progressListener); Last opp opplasting = tm. Opplasting (forespørsel);

De ProgressListener vi opprettet, fortsetter ganske enkelt å skrive ut antall byte som er overført til opplastingen er fullført.

3.6. Kontrollerer parallellisme

Som standard, TransferManager bruker maksimalt ti tråder for å utføre opplasting med flere deler.

Vi kan imidlertid kontrollere dette ved å spesifisere en ExecutorService mens du bygger TransferManager:

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

Her brukte vi en lambda for å lage en wrapperimplementering av ExecutorFactory og ga den videre til withExecutorFactory () funksjon.

4. Konklusjon

I denne raske artikkelen lærte vi hvordan vi kan utføre flerdelt opplastinger ved hjelp av AWS SDK for Java, og vi så hvordan du kan kontrollere noen aspekter ved opplasting og holde oversikt over fremdriften.

Som alltid er den fullstendige koden i denne artikkelen tilgjengelig på GitHub.