AWS S3 dengan Java

1. Pengenalan

Dalam tutorial ini, kita akan belajar bagaimana berinteraksi dengan sistem penyimpanan Amazon S3 (Simple Storage Service) secara terprogram, dari Java.

Ingat bahawa S3 mempunyai struktur yang sangat sederhana - setiap baldi dapat menyimpan sejumlah objek yang dapat diakses menggunakan antara muka SOAP atau API gaya REST.

Ke depan, kami akan menggunakan AWS SDK untuk Java untuk membuat, menyenaraikan, dan menghapus baldi S3. Kami juga akan memuat naik, menyenaraikan, memuat turun, menyalin, memindahkan, menamakan semula dan menghapus objek di dalam baldi ini.

2. Pergantungan Maven

Sebelum memulakan, kita perlu menyatakan kebergantungan AWS SDK dalam projek kita:

 com.amazonaws aws-java-sdk 1.11.163 

Untuk melihat versi terkini, periksa Maven Central.

3. Prasyarat

Untuk menggunakan AWS SDK, kami memerlukan beberapa perkara:

  1. Akaun AWS: kami memerlukan akaun Perkhidmatan Web Amazon. Sekiranya anda masih belum memilikinya, teruskan dan buat akaun
  2. Kredensial Keselamatan AWS: Ini adalah kunci akses kami yang membolehkan kami membuat panggilan program ke tindakan AWS API. Kita boleh mendapatkan bukti kelayakan ini dengan dua cara, sama ada dengan menggunakan kelayakan akaun root AWS dari bahagian kunci akses halaman Kredensial Keselamatan atau dengan menggunakan kelayakan pengguna IAM dari konsol IAM
  3. Memilih Wilayah AWS: Kita harus memilih kawasan AWS di mana kita mahu menyimpan data Amazon S3 kita. Perlu diingat bahawa harga penyimpanan S3 berbeza mengikut wilayah. Untuk maklumat lebih lanjut, pergi ke dokumentasi rasmi. Untuk tutorial ini, kami akan menggunakan AS Timur (Ohio) (wilayah kami-timur-2 )

4. Membuat Sambungan Pelanggan

Pertama, kita perlu membuat sambungan pelanggan untuk mengakses perkhidmatan web Amazon S3. Kami akan menggunakan antara muka AmazonS3 untuk tujuan ini:

AWSCredentials credentials = new BasicAWSCredentials( "", "" ); 

Dan kemudian konfigurasikan pelanggan:

AmazonS3 s3client = AmazonS3ClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(Regions.US_EAST_2) .build();

5. Operasi Bucket Amazon S3

5.1. Membuat Baldi

Penting untuk diperhatikan bahawa ruang nama baldi dikongsi oleh semua pengguna sistem. Oleh itu, nama baldi kami mestilah unik untuk semua nama baldi yang ada di Amazon S3 (kami akan mengetahui cara memeriksanya dalam sekejap sahaja)

Lebih-lebih lagi, seperti yang dinyatakan dalam dokumentasi rasmi, nama Bucket mesti memenuhi syarat berikut:

  • nama tidak boleh mengandungi garis bawah
  • panjangnya mestilah antara 3 hingga 63 aksara
  • nama tidak boleh diakhiri dengan tanda sempang
  • nama tidak boleh mengandungi titik bersebelahan
  • nama tidak boleh mengandungi tanda sempang di sebelah titik (misalnya, "my-.bucket.com" dan "my.-bucket" tidak sah)
  • nama tidak boleh mengandungi huruf besar

Mari buat baldi:

String bucketName = "baeldung-bucket"; if(s3client.doesBucketExist(bucketName)) { LOG.info("Bucket name is not available." + " Try again with a different Bucket name."); return; } s3client.createBucket(bucketName);

Di sini, kami menggunakan s3client yang kami buat pada langkah sebelumnya. Sebelum membuat baldi, kami memeriksa sama ada nama baldi kami ada atau tidak dengan menggunakan kaedah doBucketExist () . Sekiranya nama ini tersedia, maka kami akan menggunakan kaedah createBucket () .

5.2. Baldi Penyenaraian

Sekarang, setelah kita membuat beberapa baldi, mari sekarang mencetak senarai semua baldi yang ada di persekitaran S3 kami menggunakan kaedah listBuckets () . Kaedah ini akan mengembalikan senarai semua Baldi:

List buckets = s3client.listBuckets(); for(Bucket bucket : buckets) { System.out.println(bucket.getName()); }

Ini akan menyenaraikan semua baldi yang terdapat di persekitaran S3 kami:

baeldung-bucket baeldung-bucket-test2 elasticbeanstalk-us-east-2

5.3. Memadamkan Baldi

Penting untuk memastikan bahawa baldi kita kosong sebelum kita dapat menghapusnya. Jika tidak, pengecualian akan dilemparkan. Juga, perhatikan bahawa hanya pemilik baldi yang dapat menghapusnya tanpa mengira kebenarannya (Dasar Kawalan Akses):

try { s3client.deleteBucket("baeldung-bucket-test2"); } catch (AmazonServiceException e) { System.err.println("e.getErrorMessage()); return; }

6. Operasi Objek Amazon S3

Fail atau kumpulan data di dalam baldi Amazon S3 dikenali sebagai objek. Kami boleh melakukan beberapa operasi pada objek seperti memuat naik, menyenaraikan, memuat turun, menyalin, memindahkan, menamakan semula dan menghapus.

6.1. Memuat naik Objek

Memuat naik objek adalah proses yang cukup mudah. Kami akan menggunakan kaedah putObject () yang menerima tiga parameter:

  1. bucketName : Nama baldi tempat kami mahu memuat naik objek
  2. kunci : Ini adalah jalan penuh ke fail
  3. file: The actual file containing the data to be uploaded
s3client.putObject( bucketName, "Document/hello.txt", new File("/Users/user/Document/hello.txt") );

6.2. Listing Objects

We'll use listObjects() method to list all the available objects in our S3 bucket:

ObjectListing objectListing = s3client.listObjects(bucketName); for(S3ObjectSummary os : objectListing.getObjectSummaries()) { LOG.info(os.getKey()); }

Calling listObjects() method of the s3client object will yield the ObjectListing object, which can be used to get a list of all the object summaries in the specified bucket. We're just printing the key here, but there are also a couple of other options available, like size, owner, last modified, storage class, etc…

This will now print a list of all the objects inside our bucket:

Document/hello.txt

6.3. Downloading an Object

To download an object, we'll first use the getObject() method on s3client which will return an S3Object object. Once we get this, we'll call getObjectContent() on this to get an S3ObjectInputStream object which behaves like a conventional Java InputStream.

S3Object s3object = s3client.getObject(bucketName, "picture/pic.png"); S3ObjectInputStream inputStream = s3object.getObjectContent(); FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));

Here, we are using FileUtils.copyInputStreamToFile() method by Apache Commons. You can also visit this Baeldung article to explore other ways to convert an InputStream to a File.

6.4. Copying, Renaming and Moving an Object

We can copy an object by calling copyObject() method on our s3client which accepts four parameters:

  1. source bucket name
  2. object key in source bucket
  3. destination bucket name (it can be same as source)
  4. object key in destination bucket
s3client.copyObject( "baeldung-bucket", "picture/pic.png", "baeldung-bucket2", "document/picture.png" );

Note: We can use a combination of copyObject() method deleteObject() for performing moving and renaming tasks. This will involve copying the object first and then deleting it from its old location.

6.5. Deleting an Object

To delete an Object, we'll call deleteObject() method on s3client and pass the bucket name and object key:

s3client.deleteObject("baeldung-bucket","picture/pic.png");

6.6. Deleting Multiple Objects

To delete multiple objects at once, we'll first create the DeleteObjectsRequest object and pass the bucket name to its constructor. Then we'll pass an array of all the object keys that we want to delete.

Setelah kita mempunyai objek DeleteObjectsRequest ini , kita boleh menyebarkannya ke kaedah deleteObjects () dari klien s3 kita sebagai argumen. Sekiranya berjaya, ini akan menghapus semua objek yang telah kami sediakan:

String objkeyArr[] = { "document/hello.txt", "document/pic.png" }; DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("baeldung-bucket") .withKeys(objkeyArr); s3client.deleteObjects(delObjReq);

7. Kesimpulannya

Dalam artikel ini, kami memfokuskan pada asas berinteraksi dengan perkhidmatan web Amazon S3 - baik di peringkat baldi dan objek.

Seperti biasa, pelaksanaan penuh tutorial ini boleh didapati di Github.