Brug af JetS3t Java-klient med Amazon S3

1. Oversigt

I denne vejledning bruger vi JetS3t-biblioteket med Amazon S3.

Kort sagt, vi opretter skovle, skriver data til dem, læser data tilbage, kopierer dem og derefter opregner og sletter dem.

2. JetS3t opsætning

2.1. Maven afhængighed

Først skal vi tilføje NATS-biblioteket og Apache HttpClient til vores pom.xml:

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

Maven Central har den nyeste version af JetS3t-biblioteket og den nyeste version af HttpClient. Kilden til JetS3t kan findes her.

Vi bruger Apache Commons Codec til en af ​​vores tests, så vi tilføjer det til vores pom.xml også:

 org.lucee commons-codec 1.10.L001 

Maven Central har den nyeste version her.

2.2. Amazon AWS-nøgler

Vi har brug for AWS-adgangsnøgler for at oprette forbindelse til S3-lagertjenesten. Her kan du oprette en gratis konto.

Når vi har en konto, skal vi oprette et sæt sikkerhedsnøgler. Der findes dokumentation om brugere og adgangsnøgler her.

JetS3t ved hjælp af logning af Apache Commons, så vi bruger det også, når vi vil udskrive oplysninger om, hvad vi laver.

3. Tilslutning til en simpel opbevaring

Nu hvor vi har en AWS-adgangsnøgle og en hemmelig nøgle, kan vi oprette forbindelse til S3-lagring.

3.1. Opretter forbindelse til AWS

Først opretter vi AWS-legitimationsoplysninger og bruger dem derefter til at oprette forbindelse til tjenesten:

AWSCredentials awsCredentials = nye AWSCredentials ("adgangsnøgle", "hemmelig nøgle"); s3Service = ny RestS3Service (awsCredentials); 

RestS3Serviceer vores forbindelse til Amazon S3.Det bruger HttpClientat kommunikere med S3 over REST.

3.2. Bekræftelse af forbindelse

Vi kan bekræfte, at vi har oprettet forbindelse til tjenesten ved at angive spande:

S3Bucket [] myBuckets = s3Service.listAllBuckets (); 

Afhængigt af om vi har oprettet skovle før, kan arrayet være tomt, men hvis operationen ikke kaster en undtagelse, har vi en gyldig forbindelse.

4. Skovlhåndtering

Med en forbindelse til Amazon S3 kan vi oprette skovle til at holde vores data. S3 er et objektlagringssystem. Data uploades som objekter og gemmes i spande.

Da alle S3-skovle har samme globale navneområde, skal hver have et unikt navn.

4.1. Oprettelse af en spand

Lad os prøve at oprette et bucket-navn “mybucket“:

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

Dette mislykkes med en undtagelse:

org.jets3t.service.S3ServiceException: Servicefejlmeddelelse. - Svarskode: 409, Svarstatus: Konflikt, XML-fejlmeddelelse: BucketAlreadyExists Det ønskede bucket-navn er ikke tilgængeligt. Bucket-navneområdet deles af alle brugere af systemet. Vælg et andet navn, og prøv igen. mybucket 07BE34FF3113ECCF på org.jets3t.service.S3Service.createBucket (S3Service.java:1586)

Navnet "mybucket”Er forudsigeligt allerede taget. For resten af ​​vejledningen sammensætter vi vores navne.

Lad os prøve igen med et andet navn:

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

Med et unikt navn lykkes opkaldet, og vi ser oplysninger om vores spand:

[INFO] JetS3tClient - S3Bucket [name = myuniquename, location = US, creationDate = Sat Mar 31 16:47:47 EDT 2018, owner = null] 

4.2. Sletning af en spand

Sletning af en spand er lige så let som at oprette den, bortset fra én ting; skovle skal være tomme, inden de kan fjernes!

s3Service.deleteBucket ("myuniquename"); 

Dette kaster en undtagelse for en spand, der ikke er tom.

4.3. Specificering af Bucket Region

Skovle kan oprettes i et specifikt datacenter.For JetS3t er standard Northern Virginia i USA eller "us-east-1".

Vi kan tilsidesætte dette ved at specificere en anden region:

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

JetS3t har en omfattende liste over regioner defineret som konstanter.

5. Upload, download og slet data

Når vi først har en spand, kan vi føje objekter til den. Skovle er beregnet til at være langvarige, og der er ingen hård grænse for størrelsen eller antallet af objekter, en spand kan indeholde.

Data uploades til S3 ved at oprette S3Objects.Vi kan uploade data a fra en InputStream,men JetS3t giver også bekvemmelighed metoder til Strengeog Filer.

5.1. SnorData

Lad os se på Strengeførst:

S3Object stringObject = ny S3Object ("objektnavn", "strengobjekt"); s3Service.putObject ("myuniquebucket", stringObject); 

I lighed med spande har genstande navne, objektnavne bor dog kun inden i deres spande, så vi behøver ikke bekymre os om, at de er globalt unikke.

Vi opretter objektet ved at videregive et navn og dataene til konstruktøren. Så gemmer vi det med putObject.

Når vi bruger denne metode til at gemme Strengemed JetS3t indstiller den den rigtige indholdstype for os.

Lad os spørge S3 for information om vores objekt og se på indholdstypen:

StorageObject objectDetailsOnly = s3Service.getObjectDetails ("myuniquebucket", "min streng"); log.info ("Indholdstype:" + objectDetailsOnly.getContentType () + "længde:" + objectDetailsOnly.getContentLength ()); 

ObjectDetailsOnly ()henter objektets metadata uden at downloade det. Når vi logger på indholdstypen ser vi:

[INFO] JetS3tClient - Indholdstype: tekst / almindelig; charset = utf-8 længde: 9 

JetS3t identificerede dataene som tekst og indstillede længden for os.

Lad os downloade dataene og sammenligne dem med det, vi uploadede:

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

Data hentes i det samme S3Objectvi bruger til at uploade det med de tilgængelige byte i en DataInputStream.

5.2. Fildata

Processen til upload af filer svarer til Strenge:

Filfil = ny fil ("src / test / resources / test.jpg"); S3Object fileObject = ny S3Object (fil); s3Service.putObject ("myuniquebucket", fileObject); 

Hvornår S3Objectser bestået a Fil de stammer deres navn fra basisnavnet på de filer, de indeholder:

[INFO] JetS3tClient - Filobjektnavn er test.jpg

JetS3t tager Fil og uploader det for os.Det vil forsøge at indlæse en mime.types-fil fra klassestien og bruge den til at identificere filtypen og sendt indholdstype korrekt.

Hvis vi henter objektinfoen for vores filupload og får den indholdstype, vi ser:

[INFO] JetS3tClient - Indholdstype: applikation / octet-stream

Lad os downloade vores fil til en ny og sammenligne indholdet:

String getFileMD5 (String filnavn) kaster IOException {prøv (FileInputStream fis = ny FileInputStream (ny fil (filnavn))) {return DigestUtils.md5Hex (fis); }} S3Object fileObject = s3Service.getObject ("myuniquebucket", "test.jpg"); Fil newFile = ny fil ("/ tmp / newtest.jpg"); Files.copy (fileObject.getDataInputStream (), newFile.toPath (), StandardCopyOption.REPLACE_EXISTING); Streng origMD5 = getFileMD5 ("src / test / resources / test.jpg"); Streng newMD5 = getFileMD5 ("src / test / resources / newtest.jpg"); assertTrue (origMD5.equals (newMD5));

Svarende til Strengevi downloadede objektet og brugte DataInputStream for at oprette en ny fil. Derefter beregnede vi en MD5-hash for begge filer og sammenlignede dem.

5.3. Streaming af data

Når vi uploader andre objekter end Strengeeller Filer,vi har lidt mere arbejde at gøre:

ArrayList numre = ny ArrayList (); // tilføje elementer til ArrayList ByteArrayOutputStream bytes = nye ByteArrayOutputStream (); ObjectOutputStream objectOutputStream = ny ObjectOutputStream (bytes); objectOutputStream.writeObject (tal); ByteArrayInputStream byteArrayInputStream = ny ByteArrayInputStream (bytes.toByteArray ()); S3Object streamObject = ny S3Object ("stream"); streamObject.setDataInputStream (byteArrayInputStream); streamObject.setContentLength (byteArrayInputStream.available ()); streamObject.setContentType ("binær / octet-stream"); s3Service.putObject (BucketName, streamObject); 

Vi er nødt til at indstille vores indholdstype og længde, inden vi uploader.

Hentning af denne strøm betyder, at processen vendes:

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

For forskellige datatyper kan egenskaben indholdstype bruges til at vælge en anden metode til afkodning af objektet.

6. Kopiering, flytning og omdøbning af data

6.1. Kopiering af objekter

Objekter kan kopieres inde i S3 uden at hente dem.

Lad os kopiere vores testfil fra afsnit 5.2 og kontrollere resultatet:

S3Object targetObject = ny S3Object ("testcopy.jpg"); s3Service.copyObject (BucketName, "test.jpg", "myuniquebucket", targetObject, false); S3Object newFileObject = s3Service.getObject ("myuniquebucket", "testcopy.jpg"); Fil newFile = ny fil ("src / test / resources / testcopy.jpg"); Files.copy (newFileObject.getDataInputStream (), newFile.toPath (), REPLACE_EXISTING); Streng origMD5 = getFileMD5 ("src / test / resources / test.jpg"); Streng newMD5 = getFileMD5 ("src / test / resources / testcopy.jpg"); assertTrue (origMD5.equals (newMD5)); 

Vi kan kopiere objekter inde i den samme spand eller mellem to forskellige.

Hvis det sidste argument er sandt, modtager det kopierede objekt nye metadata. Ellers bevares kildegenstandens metadata.

Hvis vi vil ændre metadataene, kan vi indstille flag til sand:

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

6.2. Bevægelige objekter

Objekter kan flyttes til en anden S3-spand i samme region.En flytning er en kopi og derefter en sletning.

Hvis kopieringen mislykkes, slettes kildeobjektet ikke. Hvis sletningen mislykkes, vil objektet stadig eksistere i kilden og også på destinationsplaceringen.

At flytte et objekt ligner at kopiere det:

s3Service.moveObject ("myuniquebucket", "test.jpg", "myotheruniquebucket", ny S3Object ("spidey.jpg"), falsk); 

6.3. Omdøbning af objekter

JetS3t har en bekvem metode til at omdøbe objekter. For at ændre et objektnavn kalder vi det blot med et nyt S3Object:

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

7. Konklusion

I denne vejledning brugte vi JetS3t til at oprette forbindelse til Amazon S3. Vi oprettede og slettede skovle. Derefter tilføjede vi forskellige typer data til spande og hentede dataene. For at afslutte tingene kopierede vi og flyttede vores data.

Kodeprøver kan som altid findes på GitHub.


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