שימוש בלקוח Java JetS3t עם אמזון S3

1. סקירה כללית

במדריך זה נשתמש בספריית JetS3t עם אמזון S3.

במילים פשוטות, ניצור דליים, נכתוב להם נתונים, נקרא נתונים בחזרה, נעתיק אותם ואז נרשום ונמחק אותם.

2. הגדרת JetS3t

2.1. תלות של Maven

ראשית, עלינו להוסיף את ספריית NATS ו- Apache HttpClient ל- שלנו pom.xml:

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

ל- Maven Central יש את הגרסה האחרונה של ספריית JetS3t ואת הגרסה האחרונה של HttpClient. המקור ל- JetS3t נמצא כאן.

אנו נשתמש בקודק של אפאצ'י קומונס לאחת הבדיקות שלנו, לכן נוסיף את זה למערכת שלנו pom.xml גַם:

 org.lucee commons-codec 1.10.L001 

ל- Maven Central יש את הגרסה האחרונה כאן.

2.2. מקשי AWS של אמזון

אנו זקוקים למפתחות גישה של AWS כדי להתחבר לשירות האחסון S3. כאן ניתן ליצור חשבון בחינם.

לאחר שיש לנו חשבון, עלינו ליצור קבוצה של מפתחות אבטחה. יש כאן תיעוד אודות משתמשים ומפתחות גישה.

JetS3t באמצעות רישום Apache Commons, כך שנשתמש בו גם כאשר אנו רוצים להדפיס מידע על מה שאנחנו עושים.

3. חיבור לאחסון פשוט

עכשיו שיש לנו מפתח גישה AWS ומפתח סודי, אנחנו יכולים להתחבר לאחסון S3.

3.1. מתחבר ל- AWS

ראשית, אנו יוצרים אישורי AWS ואז משתמשים בהם כדי להתחבר לשירות:

AWSCredentials awsCredentials = AWSCredentials חדשים ("מפתח גישה", "מפתח סודי"); s3Service = RestS3Service חדש (awsCredentials); 

RestS3Serviceהוא החיבור שלנו לאמזון S3.זה משתמש HttpClientלתקשר עם S3 במהלך REST.

3.2. מאמת חיבור

אנו יכולים לאמת שהתחברנו בהצלחה לשירות על ידי רישום דליים:

S3Bucket [] myBuckets = s3Service.listAllBuckets (); 

תלוי אם יצרנו דליים בעבר או לא, המערך יכול להיות ריק, אך אם הפעולה אינה יוצאת מהכלל, יש לנו חיבור חוקי.

4. ניהול דליים

עם חיבור ל- Amazon S3, אנו יכולים ליצור דליים כדי להחזיק את הנתונים שלנו. S3 היא מערכת אחסון אובייקטים. הנתונים מועלים כאובייקטים ומאוחסנים בדליים.

מכיוון שכל דלי ה- S3 חולקים את אותו מרחב שמות עולמי, כל אחד מהם חייב להיות בעל שם ייחודי.

4.1. יצירת דלי

בואו ננסה ליצור שם דלי “mybucket“:

S3Bucket דלי = s3Service.createBucket ("mybucket"); 

זה נכשל למעט יוצא מן הכלל:

org.jets3t.service.S3ServiceException: הודעת שגיאה בשירות. - תגובת קוד: 409, תגובה סטטוס: התנגשות, הודעת שגיאה XML: BucketAlreadyExists שם הדלי המבוקש אינו זמין. מרחב השמות של דלי משותף לכל משתמשי המערכת. אנא בחר שם אחר ונסה שוב. mybucket 07BE34FF3113ECCF באתר org.jets3t.service.S3Service.createBucket (S3Service.java:1586)

השם "mybucket", כצפוי, כבר נלקח. להמשך ההדרכה נמציא את שמותינו.

בואו ננסה שוב בשם אחר:

S3Bucket דלי = s3Service.createBucket ("myuniquename"); log.info (דלי); 

עם שם ייחודי, השיחה מצליחה ואנחנו רואים מידע על הדלי שלנו:

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

4.2. מחיקת דלי

מחיקת דלי קלה כמו יצירתה, למעט דבר אחד; דליים חייבים להיות ריקים לפני שניתן להסיר אותם!

s3Service.deleteBucket ("שם המיוחד שלי"); 

זה ישליך חריג על דלי שאינו ריק.

4.3. ציון אזור הדלי

ניתן ליצור דליים במרכז נתונים ספציפי.עבור JetS3t ברירת המחדל היא וירג'יניה הצפונית בארצות הברית, או "us-east-1".

אנו יכולים לעקוף זאת על ידי ציון אזור אחר:

S3Bucket euBucket = s3Service.createBucket ("דלי eu", S3Bucket.LOCATION_EUROPE); S3Bucket usWestBucket = s3Service .createBucket ("us-west-bucket", S3Bucket.LOCATION_US_WEST); S3Bucket asiaPacificBucket = s3Service .createBucket ("אסיה-פסיפיק-דלי", S3Bucket.LOCATION_ASIA_PACIFIC); 

ל- JetS3t יש רשימה נרחבת של אזורים המוגדרים כקבועים.

5. העלה, הורד ומחק נתונים

ברגע שיש לנו דלי, אנחנו יכולים להוסיף אליו חפצים. הדליים נועדו לאורך זמן, ואין מגבלה קשה על גודל או מספר החפצים שדלי יכול להכיל.

הנתונים מועלים ל- S3 על ידי יצירת S3Objects.אנו יכולים להעלות נתונים א מ- InputStream,אך JetS3t מספק גם שיטות נוחות עבור מיתריםו קבצים.

5.1. חוּטנתונים

בואו נסתכל על מיתריםראשון:

S3Object stringObject = S3Object חדש ("שם אובייקט", "אובייקט מחרוזת"); s3Service.putObject ("myuniquebucket", stringObject); 

בדומה לדליים, לחפצים יש שמות, עם זאת, שמות חפצים חיים רק בתוך הדליים שלהם, כך שאיננו צריכים לדאוג שהם ייחודיים בעולם.

אנו יוצרים את האובייקט על ידי העברת שם והנתונים לבנאי. ואז אנחנו מאחסנים את זה עם putObject.

כאשר אנו משתמשים בשיטה זו לאחסון מיתריםעם JetS3t, הוא מגדיר את סוג התוכן הנכון עבורנו.

בואו ונשאול את S3 למידע על האובייקט שלנו ונראה את סוג התוכן:

StorageObject objectDetailsOnly = s3Service.getObjectDetails ("myuniquebucket", "המחרוזת שלי"); log.info ("סוג תוכן:" + objectDetailsOnly.getContentType () + "אורך:" + objectDetailsOnly.getContentLength ()); 

ObjectDetailsOnly ()מאחזר את המטא-נתונים של האובייקטים מבלי להוריד אותם. כאשר אנו רושמים את סוג התוכן אנו רואים:

[INFO] JetS3tClient - סוג תוכן: טקסט / רגיל; ערכת = אורך utf-8: 9 

JetS3t זיהה את הנתונים כטקסט וקבע לנו את האורך.

בואו נוריד את הנתונים ונשווה אותם למה שהעלינו:

S3Object downloadObject = s3Service.getObject ("myuniquebucket," אובייקט מחרוזת "); מחרוזת downloadString = BufferedReader חדש (InputStreamReader חדש (object.getDataInputStream ())). שורות (). אסוף (Collectors.joining (" \ n ")); assertTrue ("אובייקט מחרוזת". שווה (downloadString));

הנתונים מאוחזרים באותו S3Objectאנו משתמשים בהעלאתו, כאשר בתים זמינים ב- DataInputStream.

5.2. נתוני קבצים

תהליך העלאת הקבצים דומה ל- מיתרים:

קובץ קובץ = קובץ חדש ("src / test / resources / test.jpg"); S3Object fileObject = S3Object חדש (קובץ); s3Service.putObject ("myuniquebucket", fileObject); 

מתי S3Objectsעוברים א קוֹבֶץ הם שואבים את שמם משם הבסיס של הקבצים שהם מכילים:

[INFO] JetS3tClient - שם אובייקט הקובץ הוא test.jpg

JetS3t לוקח את קוֹבֶץ ומעלה את זה בשבילנו.הוא ינסה לטעון קובץ mime.types מ- classpath ולהשתמש בו כדי לזהות את סוג הקובץ וסוג התוכן שנשלח כראוי.

אם אנו מאחזרים את פרטי האובייקט של העלאת הקובץ שלנו ומקבלים את סוג התוכן שנראה:

[INFO] JetS3tClient - סוג תוכן: יישום / זרם אוקטט

בואו הורד את הקובץ לקובץ חדש ונשווה את התוכן:

מחרוזת getFileMD5 (שם קובץ מחרוזת) זורק IOException {נסה (FileInputStream fis = FileInputStream חדש (קובץ חדש (שם קובץ))) {החזר DigestUtils.md5Hex (fis); }} S3Object fileObject = s3Service.getObject ("myuniquebucket", "test.jpg"); קובץ newFile = קובץ חדש ("/ tmp / newtest.jpg"); Files.copy (fileObject.getDataInputStream (), newFile.toPath (), StandardCopyOption.REPLACE_EXISTING); מחרוזת origMD5 = getFileMD5 ("src / test / resources / test.jpg"); מחרוזת newMD5 = getFileMD5 ("src / test / resources / newtest.jpg"); assertTrue (origMD5.equals (newMD5));

דומה ל מיתריםהורדנו את האובייקט והשתמשנו ב- DataInputStream כדי ליצור קובץ חדש. ואז חישבנו חשיש MD5 לשני הקבצים והשווינו ביניהם.

5.3. הזרמת נתונים

כאשר אנו מעלים חפצים שאינם מיתריםאוֹ קבצים,יש לנו עוד קצת עבודה לעשות:

מספרי ArrayList = ArrayList חדש (); // הוספת אלמנטים לבתים ArrayList ByteArrayOutputStream = ByteArrayOutputStream חדש (); ObjectOutputStream objectOutputStream = ObjectOutputStream חדש (בתים); objectOutputStream.writeObject (מספרים); ByteArrayInputStream byteArrayInputStream = ByteArrayInputStream חדש (bytes.toByteArray ()); S3Object streamObject = S3Object חדש ("זרם"); streamObject.setDataInputStream (byteArrayInputStream); streamObject.setContentLength (byteArrayInputStream.available ()); streamObject.setContentType ("stream / octet-stream"); s3Service.putObject (BucketName, streamObject); 

עלינו להגדיר את סוג התוכן ואת אורך התוכן לפני העלאתנו.

אחזור זרם זה פירושו להפוך את התהליך:

S3Object newStreamObject = s3Service.getObject (שם דלי, "זרם"); ObjectInputStream objectInputStream = 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)); 

עבור סוגי נתונים שונים, ניתן להשתמש במאפיין סוג התוכן לבחירת שיטה אחרת לפענוח האובייקט.

6. העתקה, העברה ושינוי שם של נתונים

6.1. העתקת אובייקטים

ניתן להעתיק אובייקטים בתוך S3, מבלי לאחזר אותם.

נעתיק את קובץ הבדיקה שלנו מסעיף 5.2 ונוודא את התוצאה:

S3Object targetObject = S3Object חדש ("testcopy.jpg"); s3Service.copyObject (BucketName, "test.jpg", "myuniquebucket", targetObject, false); S3Object newFileObject = s3Service.getObject ("myuniquebucket", "testcopy.jpg"); קובץ newFile = קובץ חדש ("src / test / resources / testcopy.jpg"); Files.copy (newFileObject.getDataInputStream (), newFile.toPath (), REPLACE_EXISTING); מחרוזת origMD5 = getFileMD5 ("src / test / resources / test.jpg"); מחרוזת newMD5 = getFileMD5 ("src / test / resources / testcopy.jpg"); assertTrue (origMD5.equals (newMD5)); 

אנו יכולים להעתיק אובייקטים בתוך אותה דלי, או בין שני דברים שונים.

אם הטיעון האחרון נכון, האובייקט המועתק יקבל מטא נתונים חדשים. אחרת, הוא ישמור על מטא הנתונים של אובייקט המקור.

אם אנו רוצים לשנות את המטא-נתונים, אנו יכולים להגדיר את הדגל ל- true:

targetObject = S3Object חדש ("testcopy.jpg"); targetObject.addMetadata ("My_Custom_Field", "שלום, עולם!"); s3Service.copyObject ("myuniquebucket", "test.jpg", "myuniquebucket", targetObject, נכון); 

6.2. אובייקטים נעים

ניתן להעביר חפצים לדלי S3 אחרים באותו אזור.פעולת העברה היא העתק ואז פעולת מחיקה.

אם פעולת ההעתקה נכשלת, אובייקט המקור לא נמחק. אם פעולת המחיקה נכשלת, האובייקט עדיין יהיה קיים במקור וגם במיקום היעד.

העברת אובייקט נראית דומה להעתקה:

s3Service.moveObject ("myuniquebucket", "test.jpg", "myotheruniquebucket", S3Object חדש ("spidey.jpg"), שקר); 

6.3. שינוי שם של אובייקטים

ל- JetS3t יש שיטת נוחות לשינוי שם עצמים. כדי לשנות שם אובייקטים אנו קוראים לו רק עם חדש S3Object:

s3Service.renameObject ("myuniquebucket", "test.jpg", S3Object חדש ("spidey.jpg")); 

7. מסקנה

במדריך זה השתמשנו ב- JetS3t כדי להתחבר לאמזון S3. יצרנו ומחקנו דליים. ואז הוספנו סוגים שונים של נתונים לדליים ואחזרנו את הנתונים. לסיום הדברים העתקנו והעברנו את הנתונים שלנו.

דוגמאות קוד, כמו תמיד, ניתן למצוא באתר GitHub.