Multipart uploads i Amazon S3 med Java

1. Oversigt

I denne vejledning ser vi, hvordan man håndterer uploads med flere dele i Amazon S3 med AWS Java SDK.

Kort sagt, i en multipart-upload deler vi indholdet i mindre dele og uploader hver del individuelt. Alle dele samles igen, når de modtages.

Multipart-uploads giver følgende fordele:

  • Højere kapacitet - vi kan uploade dele parallelt
  • Lettere fejlgendannelse - vi skal kun uploade de mislykkede dele igen
  • Pause og genoptag uploads - vi kan uploade dele til enhver tid. Hele processen kan sættes på pause, og de resterende dele kan uploades senere

Bemærk, at når du bruger multipart-upload med Amazon S3 skal hver del undtagen den sidste del være mindst 5 MB i størrelse.

2. Maven-afhængigheder

Før vi begynder, skal vi tilføje AWS SDK-afhængighed i vores projekt:

 com.amazonaws aws-java-sdk 1.11.290 

For at se den nyeste version, se Maven Central.

3. Udførelse af upload af flere dele

3.1. Oprettelse af Amazon S3-klient

Først skal vi Opret en klient for at få adgang til Amazon S3. Vi bruger AmazonS3ClientBuilder til dette formål:

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

Dette skaber en klient, der bruger standardudbyderkæden til legitimationsoplysninger til at få adgang til AWS-legitimationsoplysninger.

Se dokumentationen for at få flere oplysninger om, hvordan standardudbyderkæden fungerer. Hvis du bruger en anden region end standardindstillingen (US West-2), skal du sørge for at udskifte den Regioner.DEFAULT_REGION med den brugerdefinerede region.

3.2. Oprettelse af TransferManager til styring af uploads

Vi bruger TransferManagerBuilder at oprette en TransferManager eksempel.

Denne klasse giver enkle API'er til styring af uploads og downloads med Amazon S3 og administrerer alle relaterede opgaver:

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

Multipart upload tærskel angiver størrelsen i byte, over hvilken upload skal udføres som multipart upload.

Amazon S3 pålægger en minimum delstørrelse på 5 MB (for andre dele end sidste del), så vi har brugt 5 MB som tærskel for upload af flere dele.

3.3. Uploader objekt

For at uploade objekt ved hjælp af TransferManager vi er simpelthen nødt til at kalde det upload () fungere. Dette uploader delene parallelt:

String bucketName = "baeldung-bucket"; String keyName = "mit-billede.jpg"; Strengfil = ny fil ("dokumenter / mit-billede.jpg"); Upload upload = tm.upload (bucketName, keyName, file);

TransferManager.upload () returnerer en Upload objekt. Dette kan bruges til at kontrollere status for og administrere uploads. Vi gør det i næste afsnit.

3.4. Venter på, at upload er afsluttet

TransferManager.upload () er en ikke-blokerende funktion; den vender straks tilbage, mens uploadet kører i baggrunden.

Vi kan Brug den returnerede Upload mod at vente på, at upload er afsluttet inden programmet afsluttes:

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

3.5. Sporing af uploadfremskridt

Spor fremdriften af ​​upload er et ganske almindeligt krav; vi kan gøre det ved hjælp af en ProgressListener eksempel:

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

Det ProgressListener vi oprettede, fortsætter blot med at udskrive antallet af overførte bytes, indtil upload er afsluttet.

3.6. Kontrol af uploadparallelisme

Som standard, TransferManager bruger maksimalt ti tråde til at udføre uploads med flere dele.

Vi kan dog kontrollere dette ved at angive en ExecutorService mens du bygger TransferManager:

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

Her brugte vi en lambda til at skabe en wrapperimplementering af ExecutorFactory og overgav det til withExecutorFactory () fungere.

4. Konklusion

I denne hurtige artikel lærte vi, hvordan man udfører uploads med flere dele ved hjælp af AWS SDK til Java, og vi så, hvordan man styrer nogle aspekter af upload og holder styr på dens fremskridt.

Som altid er den komplette kode i denne artikel tilgængelig på GitHub.