Korištenje JetS3t Java klijenta s Amazonom S3

1. Pregled

U ovom uputstvu koristit ćemo knjižnicu JetS3t s Amazonom S3.

Jednostavno rečeno, stvorit ćemo segmente, upisati im podatke, pročitati podatke, kopirati ih, a zatim ih navesti i izbrisati.

2. Postavljanje JetS3t

2.1. Ovisnost Mavena

Prvo moramo dodati NATS biblioteku i Apache HttpClient u našu pom.xml:

 org.lucee jets3t 0.9.4.0006L org.apache.httpkomponente httpclient 4.5.5 

Maven Central ima najnoviju verziju biblioteke JetS3t i najnoviju verziju HttpClienta. Izvor za JetS3t možete pronaći ovdje.

Koristit ćemo Apache Commons Codec za jedan od naših testova, pa ćemo to dodati našem pom.xml isto:

 org.lucee commons-codec 1.10.L001 

Maven Central ovdje ima najnoviju verziju.

2.2. Amazonovi AWS ključevi

Trebat će nam pristupni ključevi AWS za povezivanje sa uslugom pohrane S3. Ovdje možete stvoriti besplatni račun.

Nakon što imamo račun, moramo stvoriti skup sigurnosnih ključeva. Ovdje je dostupna dokumentacija o korisnicima i pristupnim ključevima.

JetS3t koristi Apache Commons evidentiranje, pa ćemo ga i mi koristiti kada želimo ispisati informacije o tome što radimo.

3. Povezivanje s jednostavnom pohranom

Sada kada imamo pristupni i tajni ključ AWS-a, možemo se povezati sa S3 pohranom.

3.1. Povezivanje s AWS-om

Prvo stvorimo vjerodajnice za AWS, a zatim ih koristimo za povezivanje s uslugom:

AWSCredentials awsCredentials = novi AWSCredentials ("pristupni ključ", "tajni ključ"); s3Service = nova RestS3Service (awsCredentials); 

RestS3Serviceje naša veza s Amazonom S3.Koristi HttpClientza komunikaciju sa S3 preko REST-a.

3.2. Provjera veze

Da bismo se uspješno povezali s uslugom, možemo provjeriti navođenjem segmenata:

S3Bucket [] myBuckets = s3Service.listAllBuckets (); 

Ovisno o tome jesmo li već kreirali segmente ili ne, niz je možda prazan, ali ako operacija ne donosi iznimku, imamo valjanu vezu.

4. Upravljanje kantama

Povezivanjem s Amazonom S3 možemo stvoriti segmente za čuvanje naših podataka. S3 je sustav za pohranu objekata. Podaci se prenose kao objekti i pohranjuju u segmente.

Budući da sve segmente S3 dijele isti globalni prostor imena, svaki mora imati jedinstveni naziv.

4.1. Stvaranje kante

Pokušajmo stvoriti naziv segmenta “mybucket“:

S3Bucket kanta = s3Service.createBucket ("mybucket"); 

Ovo ne uspije s iznimkom:

org.jets3t.service.S3ServiceException: Poruka o pogrešci usluge. - ResponseCode: 409, ResponseStatus: Sukob, XML poruka o pogrešci: BucketAlreadyExists Traženi naziv segmenta nije dostupan. Prostor imena segmenta dijele svi korisnici sustava. Odaberite drugo ime i pokušajte ponovo. mybucket 07BE34FF3113ECCF na org.jets3t.service.S3Service.createBucket (S3Service.java:1586)

Ime "mybucket”Je, predvidljivo, već snimljen. Za ostatak vodiča izradit ćemo svoja imena.

Pokušajmo ponovo s drugim imenom:

S3Bucket kanta = s3Service.createBucket ("myuniquename"); log.info (kanta); 

Jedinstvenim imenom poziv je uspio i vidimo podatke o našoj skupini:

[INFO] JetS3tClient - S3Bucket [name = myuniquename, location = US, creationDate = Sub 31. ožujka 16:47:47 EDT 2018, owner = null] 

4.2. Brisanje segmenta

Brisanje segmenta lako je poput stvaranja, osim jedne stvari; kante moraju biti prazne prije nego što se mogu ukloniti!

s3Service.deleteBucket ("myuniquename"); 

To će izbaciti iznimku za kantu koja nije prazna.

4.3. Određivanje područja segmenta

Segmenti se mogu kreirati u određenom podatkovnom centru.Za JetS3t zadana zadaća je Sjeverna Virginia u Sjedinjenim Državama, ili "us-east-1".

To možemo nadjačati određivanjem druge regije:

S3Bucket euBucket = s3Service.createBucket ("eu-kanta", S3Bucket.LOCATION_EUROPE); S3Bucket usWestBucket = s3Service .createBucket ("us-zapad-kanta", S3Bucket.LOCATION_US_WEST); S3Bucket asiaPacificBucket = s3Service .createBucket ("asia-pacific-bucket", S3Bucket.LOCATION_ASIA_PACIFIC); 

JetS3t ima opsežan popis regija definiranih kao konstante.

5. Prenesite, preuzmite i izbrišite podatke

Nakon što imamo kantu, možemo joj dodavati objekte. Kante su namijenjene dugotrajnosti i ne postoji čvrsto ograničenje veličine ili broja predmeta koje kanta može sadržavati.

Podaci se prenose na S3 stvaranjem S3Objekti.Možemo učitati podatke iz InputStream,ali JetS3t također pruža pogodne metode za Žicei Datoteke.

5.1. NizPodaci

Pogledajmo Žiceprvi:

S3Object stringObject = novi S3Object ("naziv objekta", "objekt niza"); s3Service.putObject ("myuniquebucket", stringObject); 

Slično kantama, objekti imaju imena, međutim, nazivi objekata žive samo u njihovim skupinama, tako da se ne moramo brinuti hoće li biti globalno jedinstveni.

Objekt stvaramo prosljeđivanjem imena i podataka konstruktoru. Zatim ga pohranjujemo sa putObject.

Kada koristimo ovu metodu za pohranu Žices JetS3t postavlja ispravnu vrstu sadržaja za nas.

Upitajmo S3 za podatke o našem objektu i pogledajmo vrstu sadržaja:

StorageObject objectDetailsOnly = s3Service.getObjectDetails ("myuniquebucket", "moj niz"); log.info ("Vrsta sadržaja:" + objectDetailsOnly.getContentType () + "dužina:" + objectDetailsOnly.getContentLength ()); 

ObjectDetailsOnly ()dohvaća metapodatke o objektima bez da ih preuzima. Kada prijavimo vrstu sadržaja, vidimo:

[INFO] JetS3tClient - vrsta sadržaja: tekst / običan; charset = utf-8 duljina: 9 

JetS3t je identificirao podatke kao tekst i odredio nam duljinu.

Preuzmimo podatke i usporedimo ih s onim što smo prenijeli:

S3Object downloadObject = s3Service.getObject ("myuniquebucket," string object "); String downloadString = new BufferedReader (new InputStreamReader (object.getDataInputStream ())). Lines (). Collect (Collectors.joining (" \ n ")); assertTrue ("objekt niza" .equals (downloadString));

Podaci se preuzimaju u istom S3Objektkoristimo ga za prijenos, s bajtovima dostupnim u a DataInputStream.

5.2. Podaci o datoteci

Proces prijenosa datoteka sličan je Žice:

Datoteka datoteke = nova datoteka ("src / test / resources / test.jpg"); S3Object fileObject = novi S3Object (datoteka); s3Service.putObject ("myuniquebucket", fileObject); 

Kada S3Objektidonose se a Datoteka oni izvode svoje ime iz osnovnog imena datoteka koje sadrže:

[INFO] JetS3tClient - Naziv objekta datoteke je test.jpg

JetS3t uzima Datoteka i postavlja ga za nas.Pokušat će učitati datoteku mime.types iz puta predavanja i upotrijebiti je za odgovarajuće prepoznavanje vrste datoteke i poslanog tipa sadržaja.

Ako dohvatimo podatke o objektu za prijenos datoteke i dobijemo vrstu sadržaja koju vidimo:

[INFO] JetS3tClient - Vrsta sadržaja: aplikacija / oktetni tok

Preuzmimo našu datoteku u novu i usporedimo sadržaj:

String getFileMD5 (naziv datoteke niza) baca IOException {try (FileInputStream fis = novi FileInputStream (nova datoteka (naziv datoteke))) {return DigestUtils.md5Hex (fis); }} S3Object fileObject = s3Service.getObject ("myuniquebucket", "test.jpg"); Datoteka newFile = nova datoteka ("/ tmp / newtest.jpg"); Files.copy (fileObject.getDataInputStream (), newFile.toPath (), StandardCopyOption.REPLACE_EXISTING); Niz origMD5 = getFileMD5 ("src / test / resources / test.jpg"); Niz newMD5 = getFileMD5 ("src / test / resources / newtest.jpg"); assertTrue (origMD5.equals (newMD5));

Slično Žicepreuzeli smo objekt i koristili DataInputStream stvoriti novu datoteku. Zatim smo izračunali MD5 hash za obje datoteke i usporedili ih.

5.3. Strujanje podataka

Kada prenosimo objekte koji nisu Žiceili Datoteke,imamo još malo posla:

Brojevi ArrayList = novi ArrayList (); // dodavanje elemenata u bajtove ArrayList ByteArrayOutputStream = new ByteArrayOutputStream (); ObjectOutputStream objectOutputStream = novi ObjectOutputStream (bajtovi); objectOutputStream.writeObject (brojevi); ByteArrayInputStream byteArrayInputStream = novi ByteArrayInputStream (bytes.toByteArray ()); S3Object streamObject = novi S3Object ("tok"); streamObject.setDataInputStream (byteArrayInputStream); streamObject.setContentLength (byteArrayInputStream.available ()); streamObject.setContentType ("binarni / oktetni tok"); s3Service.putObject (Ime segmenta, streamObject); 

Prije prijenosa moramo postaviti vrstu i duljinu sadržaja.

Preuzimanje ovog toka znači preokretanje postupka:

S3Object newStreamObject = s3Service.getObject (Ime segmenta, "stream"); ObjectInputStream objectInputStream = novi ObjectInputStream (newStreamObject.getDataInputStream ()); ArrayList newNumbers = (ArrayList) objectInputStream .readObject (); assertEquals (2, (int) newNumbers.get (0)); assertEquals (3, (int) newNumbers.get (1)); assertEquals (5, (int) newNumbers.get (2)); assertEquals (7, (int) newNumbers.get (3)); 

Za različite tipove podataka svojstvo tipa sadržaja može se koristiti za odabir drugačije metode za dekodiranje objekta.

6. Kopiranje, premještanje i preimenovanje podataka

6.1. Kopiranje objekata

Objekti se mogu kopirati unutar S3, bez njihovog dohvaćanja.

Kopirajmo našu testnu datoteku iz odjeljka 5.2 i provjerimo rezultat:

S3Object targetObject = novi S3Object ("testcopy.jpg"); s3Service.copyObject (Ime segmenta, "test.jpg", "myuniquebucket", targetObject, false); S3Object newFileObject = s3Service.getObject ("myuniquebucket", "testcopy.jpg"); Datoteka newFile = nova datoteka ("src / test / resources / testcopy.jpg"); Files.copy (newFileObject.getDataInputStream (), newFile.toPath (), REPLACE_EXISTING); Niz origMD5 = getFileMD5 ("src / test / resources / test.jpg"); Niz newMD5 = getFileMD5 ("src / test / resources / testcopy.jpg"); assertTrue (origMD5.equals (newMD5)); 

Objekte možemo kopirati unutar istog segmenta ili između dva različita.

Ako je posljednji argument istinit, kopirani objekt primit će nove metapodatke. Inače će zadržati metapodatke izvornog objekta.

Ako želimo izmijeniti metapodatke, zastavicu možemo postaviti na true:

targetObject = novi S3Object ("testcopy.jpg"); targetObject.addMetadata ("My_Custom_Field", "Hello, World!"); s3Service.copyObject ("myuniquebucket", "test.jpg", "myuniquebucket", targetObject, true); 

6.2. Premještanje objekata

Objekti se mogu premjestiti u drugu S3 kantu u istoj regiji.Operacija premještanja je kopiranje, a zatim brisanje.

Ako operacija kopiranja ne uspije, izvorni objekt se ne briše. Ako operacija brisanja ne uspije, objekt će i dalje postojati u izvoru, a također i na odredišnom mjestu.

Premještanje objekta izgleda slično kopiranju:

s3Service.moveObject ("myuniquebucket", "test.jpg", "myotheruniquebucket", novi S3Object ("spidey.jpg"), netačno); 

6.3. Preimenovanje objekata

JetS3t ima praktičnu metodu za preimenovanje objekata. Da bismo promijenili ime predmeta, samo ga nazivamo novim S3Objekt:

s3Service.renameObject ("myuniquebucket", "test.jpg", novi S3Object ("spidey.jpg")); 

7. Zaključak

U ovom uputstvu koristili smo JetS3t za povezivanje s Amazonom S3. Stvorili smo i izbrisali segmente. Zatim smo u segmente dodali različite vrste podataka i dohvatili ih. Da bismo zaključili stvari, kopirali smo i premjestili svoje podatke.

Uzorke koda, kao i uvijek, možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found