Viacdielne nahrávanie na Amazon S3 s programom Java

1. Prehľad

V tomto tutoriáli sa dozvieme, ako zvládnuť viacdielne nahrávanie v Amazon S3 pomocou AWS Java SDK.

Jednoducho povedané, pri viacdielnom nahrávaní rozdelíme obsah na menšie časti a každú časť nahráme osobitne. Po obdržaní sú všetky diely znovu zmontované.

Viacdielne nahrávanie ponúka nasledujúce výhody:

  • Vyššia priepustnosť - môžeme nahrávať diely paralelne
  • Ľahšie zotavenie po chybe - musíme znova nahrať iba zlyhané časti
  • Pozastavenie a obnovenie nahrávania - časti môžeme nahrať kedykoľvek. Celý proces je možné pozastaviť a zvyšné časti je možné nahrať neskôr

Upozorňujeme, že pri použití viacdielneho nahrávania pri Amazon S3 musí byť každá časť okrem poslednej časti veľká aspoň 5 MB.

2. Maven závislosti

Než začneme, musíme do nášho projektu pridať závislosť AWS SDK:

 com.amazonaws aws-java-sdk 1.11.290 

Najnovšiu verziu si môžete pozrieť v Maven Central.

3. Vykonanie viacdielneho nahrávania

3.1. Vytváranie klienta Amazon S3

Najprv musíme vytvoriť klienta pre prístup k službe Amazon S3. Použijeme AmazonS3ClientBuilder pre tento účel:

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

Týmto sa vytvorí klient, ktorý použije predvolený reťazec poskytovateľov poverení na prístup k povereniam AWS.

Ďalšie informácie o tom, ako funguje predvolený reťazec poskytovateľov poverení, nájdete v dokumentácii. Ak používate inú oblasť ako predvolenú (USA západ-2), nezabudnite vymeniť Regióny.DEFAULT_REGION s týmto zvykovým regiónom.

3.2. Vytvorenie aplikácie TransferManager na správu nahrávania

Použijeme TransferManagerBuilder vytvoriť TransferManager inštancia.

Táto trieda poskytuje jednoduché API na správu nahrávania a sťahovania s Amazon S3 a spravuje všetky súvisiace úlohy:

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

Prahová hodnota pre nahrávanie viacerých častí určuje veľkosť v bajtoch, nad ktorou by sa malo nahrávanie vykonať ako odovzdanie viacerých častí.

Amazon S3 ukladá minimálnu veľkosť časti 5 MB (pre časti iné ako posledná časť), preto sme ako medznú hodnotu pre viacdielne nahrávanie použili 5 MB.

3.3. Načítava sa objekt

Na nahranie objektu pomocou TransferManager jednoducho musíme zavolať jeho nahrať () funkcie. Toto nahrá časti paralelne:

Reťazec bucketName = "baeldung-bucket"; Reťazec keyName = "my-picture.jpg"; Reťazcový súbor = nový súbor ("documents / my-picture.jpg"); Nahrať upload = tm.upload (bucketName, keyName, súbor);

TransferManager.upload () vracia Nahrať objekt. To možno použiť na kontrolu stavu a správu nahrávania. Urobíme tak v ďalšej časti.

3.4. Čaká sa na dokončenie nahrávania

TransferManager.upload () je neblokujúca funkcia; vráti sa okamžite, zatiaľ čo nahrávanie beží na pozadí.

Môžeme použiť vrátené Nahrať objekt čakať na dokončenie nahrávania pred ukončením programu:

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

3.5. Sledovanie priebehu nahrávania

Sledovanie priebehu nahrávania je úplne bežná požiadavka; môžeme to urobiť pomocou a ProgressListener inštancia:

ProgressListener progressListener = progressEvent -> System.out.println ("Prevedené bajty:" + progressEvent.getBytesTransferred ()); PutObjectRequest request = new PutObjectRequest (bucketName, keyName, file); request.setGeneralProgressListener (progressListener); Nahrať upload = tm.upload (požiadavka);

The ProgressListener ktoré sme vytvorili, budú jednoducho pokračovať v tlači počtu prenesených bajtov, kým sa nahrávanie nedokončí.

3.6. Ovládanie paralelnosti nahrávania

Predvolene, TransferManager používa na vykonávanie viacdielnych nahrávaní maximálne desať vlákien.

Môžeme to však kontrolovať zadaním znaku ExecutorService pri stavaní TransferManager:

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

Tu sme použili lambdu na vytvorenie súhrnnej implementácie ExecutorFactory a podal to withExecutorFactory () funkcie.

4. Záver

V tomto rýchlom článku sme sa naučili, ako vykonávať viacdielne nahrávanie pomocou AWS SDK pre Javu, a videli sme, ako ovládať niektoré aspekty nahrávania a sledovať jeho priebeh.

Úplný kód tohto článku je ako vždy k dispozícii na serveri GitHub.