A JetS3t Java kliens használata az Amazon S3 alkalmazással

1. Áttekintés

Ebben az oktatóanyagban a JetS3t könyvtárat fogjuk használni az Amazon S3-mal.

Egyszerűen fogalmazva létrehozunk egy vödröt, adatokat írunk nekik, visszaolvassuk az adatokat, lemásoljuk, majd felsoroljuk és töröljük őket.

2. A JetS3t beállítása

2.1. Maven-függőség

Először hozzá kell adnunk a NATS könyvtárat és az Apache HttpClient könyvtárunkat pom.xml:

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

A Maven Central rendelkezik a JetS3t könyvtár legújabb verziójával és a HttpClient legújabb verziójával. A JetS3t forrása itt található.

Az egyik tesztünkhöz az Apache Commons Codec-et fogjuk használni, ezért hozzáadjuk ezt a tesztünkhöz pom.xml is:

 org.lucee commons-kodek 1.10.L001 

A Maven Central itt található a legújabb verzióval.

2.2. Amazon AWS kulcsok

Szükségünk lesz AWS hozzáférési kulcsokra, hogy csatlakozzunk az S3 tárolási szolgáltatáshoz. Ingyenes fiók létrehozható itt.

Miután rendelkezünk fiókkal, létre kell hoznunk egy biztonsági kulcs készletet. Itt találhatók dokumentációk a felhasználókról és a hozzáférési kulcsokról.

A JetS3t az Apache Commons naplózását használja, ezért azt is használni fogjuk, ha információkat akarunk kinyomtatni arról, hogy mit csinálunk.

3. Csatlakozás egyszerű tárolóhoz

Most, hogy van AWS hozzáférési és titkos kulcsunk, csatlakozhatunk az S3 tárolóhoz.

3.1. Csatlakozás AWS-hez

Először létrehozunk AWS hitelesítő adatokat, majd felhasználjuk őket a szolgáltatáshoz való csatlakozáshoz:

AWSCredentials awsCredentials = új AWSC hitelesítő adatok ("hozzáférési kulcs", "titkos kulcs"); s3Service = új RestS3Service (awsCredentials); 

RestS3Servicekapcsolatunk az Amazon S3-mal.Használja HttpClienthogy kommunikáljon az S3-val a REST-en keresztül.

3.2. A kapcsolat ellenőrzése

A csoportok felsorolásával ellenőrizhetjük, hogy sikeresen kapcsolódtunk-e a szolgáltatáshoz:

S3Bucket [] myBuckets = s3Service.listAllBuckets (); 

Attól függően, hogy korábban hoztunk-e létre vödröket, a tömb üres lehet, de ha a művelet nem vet ki kivételt, akkor érvényes kapcsolatunk van.

4. Kanalak kezelése

Az Amazon S3 kapcsolattal létrehozhatunk vödröket adataink tárolására. Az S3 egy objektumtároló rendszer. Az adatokat objektumokként töltik fel, és vödrökben tárolják.

Mivel az összes S3 vödör azonos globális névtérrel rendelkezik, mindegyiknek egyedi névvel kell rendelkeznie.

4.1. Vödör létrehozása

Próbáljunk meg létrehozni egy vödör nevetvödör“:

S3Bucket vödör = s3Service.createBucket ("mybucket"); 

Ez egy kivétellel kudarcot vall:

org.jets3t.service.S3ServiceException: Szolgáltatási hibaüzenet. - ResponseCode: 409, ResponseStatus: Konfliktus, XML hibaüzenet: BucketAlreadyExists A kért csoport neve nem érhető el. A sáv névterét a rendszer minden felhasználója megosztja. Válasszon egy másik nevet, és próbálja újra. mybucket 07BE34FF3113ECCF at org.jets3t.service.S3Service.createBucket (S3Service.java:1586)

A név "vödör”Kiszámíthatóan már megtörtént. A bemutató további részében kitaláljuk a nevünket.

Próbálkozzon újra egy másik névvel:

S3Bucket vödör = s3Service.createBucket ("myuniquename"); log.info (vödör); 

Egyedi névvel a hívás sikeres, és információkat látunk a vödörünkről:

[INFO] JetS3tClient - S3Bucket [név = myuniquename, hely = USA, creationDate = szombat, március 31, 16:47:47 EDT, 2018 

4.2. Vödör törlése

A vödör törlése ugyanolyan egyszerű, mint a létrehozása, egy dolgot leszámítva; a kanalaknak üreseknek kell lenniük, mielőtt eltávolíthatnák őket!

s3Service.deleteBucket ("myuniquename"); 

Ez kivételt vet egy nem üres vödörre.

4.3. A vödör régió meghatározása

A vödrök egy adott adatközpontban hozhatók létre.A JetS3t esetében az alapértelmezett érték Észak-Virginia az Egyesült Államokban, vagy „us-kelet-1”.

Ezt felülírhatjuk egy másik régió megadásával:

S3Bucket euBucket = s3Service.createBucket ("eu-vödör", S3Bucket.LOCATION_EUROPE); S3Bucket usWestBucket = s3Service .createBucket ("us-west-bucket", S3Bucket.LOCATION_US_WEST); S3Bucket asiaPacificBucket = s3Service .createBucket ("asia-pacific-bucket", S3Bucket.LOCATION_ASIA_PACIFIC); 

A JetS3t kiterjedt listát tartalmaz az állandóként definiált régiókról.

5. Adatok feltöltése, letöltése és törlése

Ha van egy vödörünk, objektumokat adhatunk hozzá. A vödrök hosszú élettartamúak, és nincs szigorú korlátozás a vödörben lévő tárgyak méretére vagy számára.

Az adatok létrehozásával feltöltésre kerülnek az S3-ba S3Tárgyak.Adatokat tölthetünk fel egy InputStream,de a JetS3t kényelmi módszereket is biztosít Húrokés Fájlok.

5.1. HúrAdat

Vessünk egy pillantást Húrokelső:

S3Object stringObject = új S3Object ("objektum neve", "karakterlánc objektum"); s3Service.putObject ("myuniquebucket", stringObject); 

A vödrökhöz hasonlóan az objektumoknak is vannak neveik, az objektumnevek azonban csak a vödrükben élnek, ezért nem kell attól tartanunk, hogy globálisan egyediek.

Az objektumot úgy hozzuk létre, hogy egy nevet és adatokat átadunk a konstruktornak. Aztán tároljuk putObject.

Amikor ezt a módszert használjuk tárolásra Húroka JetS3t segítségével a megfelelő tartalomtípust állítja be számunkra.

Lekérdezzük az S3-at az objektumunkra vonatkozó információkért, és nézzük meg a tartalom típusát:

StorageObject objectDetailsOnly = s3Service.getObjectDetails ("myuniquebucket", "az én karakterláncom"); log.info ("Tartalom típusa:" + objectDetailsOnly.getContentType () + "length:" + objectDetailsOnly.getContentLength ()); 

ObjectDetailsOnly ()letölti az objektumok metaadatait. Amikor naplózza a megjelenített tartalomtípust:

[INFO] JetS3tClient - Tartalom típusa: text / plain; karakterkészlet = utf-8 hossza: 9 

A JetS3t az adatokat szövegként azonosította, és beállította számunkra a hosszt.

Töltsük le az adatokat, és hasonlítsuk össze a feltöltöttekkel:

S3Object downloadObject = s3Service.getObject ("myuniquebucket," string object "); Karakterlánc downloadString = new BufferedReader (új InputStreamReader (object.getDataInputStream ())). Sorok (). Gyűjt (Collectors.joining (" \ n ")); assertTrue ("karakterlánc objektum" .egyenlő (downloadString));

Az adatok lekérdezése ugyanaz S3Objecta feltöltéshez használjuk, az a-ban elérhető bájtokkal DataInputStream.

5.2. Fájl adatok

A fájlok feltöltésének folyamata hasonló Húrok:

Fájlfájl = új Fájl ("src / test / resources / test.jpg"); S3Object fileObject = új S3Object (fájl); s3Service.putObject ("myuniquebucket", fileObject); 

Mikor S3Tárgyakátadják a File nevüket a bennük található fájlok alapnevéből nyerik:

[INFO] JetS3tClient - A fájlobjektum neve test.jpg

A JetS3t veszi a File és feltölti nekünk.Megpróbál betölteni egy mime.types fájlt az osztályútvonalról, és ennek segítségével azonosítja a fájl és az elküldött tartalom típusát.

Ha lekérjük a fájlfeltöltésünk objektumadatait, és megkapjuk a látható tartalomtípust:

[INFO] JetS3tClient - Tartalom típusa: alkalmazás / oktett-adatfolyam

Töltsük le egy új fájlunkat, és hasonlítsuk össze a tartalmát:

A getFileMD5 (karakterlánc-fájlnév) karakterlánc az IOException-t dobja {try (FileInputStream fis = new FileInputStream (new File (fájlnév))] {return DigestUtils.md5Hex (fis); }} S3Object fileObject = s3Service.getObject ("myuniquebucket", "test.jpg"); Fájl newFile = új fájl ("/ tmp / newtest.jpg"); Files.copy (fileObject.getDataInputStream (), newFile.toPath (), StandardCopyOption.REPLACE_EXISTING); Karakterlánc origMD5 = getFileMD5 ("src / test / resources / test.jpg"); Karakterlánc newMD5 = getFileMD5 ("src / test / resources / newtest.jpg"); assertTrue (origMD5.egyenlő (newMD5));

Hasonló Húrokletöltöttük az objektumot és a DataInputStream új fájl létrehozásához. Ezután kiszámoltunk egy MD5 kivonatot mindkét fájlhoz, és összehasonlítottuk őket.

5.3. Adatfolyam

Amikor nem objektumokat töltünk fel Húrokvagy Fájlok,egy kicsit több munkánk van:

ArrayList számok = new ArrayList (); // elemek hozzáadása az ArrayList ByteArrayOutputStream bájtokhoz = new ByteArrayOutputStream (); ObjectOutputStream objectOutputStream = új ObjectOutputStream (bájtok); objectOutputStream.writeObject (számok); ByteArrayInputStream byteArrayInputStream = új ByteArrayInputStream (bytes.toByteArray ()); S3Object streamObject = új S3Object ("stream"); streamObject.setDataInputStream (byteArrayInputStream); streamObject.setContentLength (byteArrayInputStream.available ()); streamObject.setContentType ("bináris / oktett-adatfolyam"); s3Service.putObject (BucketName, streamObject); 

A feltöltés előtt be kell állítanunk a tartalom típusát és hosszát.

A folyam lekérése a folyamat megfordítását jelenti:

S3Object newStreamObject = s3Service.getObject (BucketName, "stream"); ObjectInputStream objectInputStream = új 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)); 

Különböző adattípusok esetén a tartalomtípus tulajdonság segítségével más módszer választható ki az objektum dekódolásához.

6. Adatok másolása, áthelyezése és átnevezése

6.1. Objektumok másolása

Az objektumok az S3 belsejében másolhatók, anélkül, hogy lekérnék őket.

Másoljuk át a tesztfájlunkat az 5.2 szakaszból, és ellenőrizzük az eredményt:

S3Object targetObject = új S3Object ("testcopy.jpg"); s3Service.copyObject (BucketName, "test.jpg", "myuniquebucket", targetObject, hamis); S3Object newFileObject = s3Service.getObject ("myuniquebucket", "testcopy.jpg"); Fájl newFile = új Fájl ("src / test / resources / testcopy.jpg"); Files.copy (newFileObject.getDataInputStream (), newFile.toPath (), REPLACE_EXISTING); Karakterlánc origMD5 = getFileMD5 ("src / test / resources / test.jpg"); Karakterlánc newMD5 = getFileMD5 ("src / test / resources / testcopy.jpg"); assertTrue (origMD5.egyenlő (newMD5)); 

Másolhatunk tárgyakat ugyanabban a vödörben, vagy két különböző között.

Ha az utolsó argumentum igaz, a másolt objektum új metaadatokat kap. Ellenkező esetben megőrzi a forrásobjektum metaadatait.

Ha módosítani akarjuk a metaadatokat, akkor a zászlót igazra állíthatjuk:

targetObject = új S3Object ("testcopy.jpg"); targetObject.addMetadata ("Saját_Custom_Field", "Hello, Világ!"); s3Service.copyObject ("myuniquebucket", "test.jpg", "myuniquebucket", targetObject, true); 

6.2. Mozgó objektumok

Az objektumok áthelyezhetők egy másik S3 vödörbe ugyanabban a régióban.Az áthelyezési művelet másolás, majd törlés.

Ha a másolási művelet sikertelen, a forrásobjektum nem törlődik. Ha a törlési művelet nem sikerül, az objektum továbbra is létezik a forrásban és a célhelyen is.

Az objektum mozgatása hasonlít a másoláshoz:

s3Service.moveObject ("myuniquebucket", "test.jpg", "myotheruniquebucket", új S3Object ("spidey.jpg"), hamis); 

6.3. Objektumok átnevezése

A JetS3t kényelmi módszerrel rendelkezik az objektumok átnevezésére. Az objektum nevének megváltoztatásához egyszerűen újnak hívjuk S3Object:

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

7. Következtetés

Ebben az oktatóanyagban a JetS3t segítségével csatlakoztunk az Amazon S3-hoz. Létrehoztunk és töröltünk vödröket. Ezután különböző típusú adatokat adtunk a gyűjtőruhákhoz, és visszakaptuk az adatokat. A dolgok összefoglalása érdekében átmásoltuk és áthelyeztük adatainkat.

A kódminták, mint mindig, a GitHubon találhatók.