Muat naik pelbagai bahagian di Amazon S3 dengan Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat bagaimana menangani muat naik pelbagai bahagian di Amazon S3 dengan AWS Java SDK.

Ringkasnya, dalam muat naik berbilang bahagian, kami membahagikan kandungan menjadi bahagian yang lebih kecil dan memuat naik setiap bahagian secara berasingan. Semua bahagian dipasang semula apabila diterima.

Muat naik berbilang bahagian menawarkan kelebihan berikut:

  • Hasil yang lebih tinggi - kita boleh memuat naik bahagian secara selari
  • Pemulihan ralat lebih mudah - kita hanya perlu memuat naik semula bahagian yang gagal sahaja
  • Jeda dan sambung semula muat naik - kami boleh memuat naik bahagian pada bila-bila masa. Seluruh proses dapat dijeda dan bahagian yang tinggal dapat dimuat kemudian

Perhatikan bahawa semasa menggunakan muat naik berbilang bahagian dengan Amazon S3, setiap bahagian kecuali bahagian terakhir mestilah berukuran sekurang-kurangnya 5 MB.

2. Pergantungan Maven

Sebelum memulakan, kita perlu menambahkan ketergantungan SDK AWS dalam projek kita:

 com.amazonaws aws-java-sdk 1.11.290 

Untuk melihat versi terkini, lihat Maven Central.

3. Melakukan Muat naik Berbilang Bahagian

3.1. Membuat Pelanggan Amazon S3

Pertama, kita perlu membuat pelanggan untuk mengakses Amazon S3. Kami akan menggunakan AmazonS3ClientBuilder untuk tujuan ini:

AmazonS3 amazonS3 = AmazonS3ClientBuilder .standard() .withCredentials(new DefaultAWSCredentialsProviderChain()) .withRegion(Regions.DEFAULT_REGION) .build();

Ini membuat pelanggan menggunakan rantai penyedia kelayakan lalai untuk mengakses kelayakan AWS.

Untuk maklumat lebih lanjut mengenai bagaimana rantai penyedia kelayakan lalai berfungsi, sila lihat dokumentasi. Sekiranya anda menggunakan wilayah selain dari kawasan lalai ( AS Barat-2 ), pastikan anda mengganti Kawasan.DEFAULT_REGION dengan wilayah tersuai itu.

3.2. Membuat TransferManager untuk Menguruskan Muat Naik

Kami akan menggunakan TransferManagerBuilder untuk membuat instance TransferManager .

Kelas ini menyediakan API mudah untuk menguruskan muat naik dan muat turun dengan Amazon S3 dan menguruskan semua tugas yang berkaitan:

TransferManager tm = TransferManagerBuilder.standard() .withS3Client(amazonS3) .withMultipartUploadThreshold((long) (5 * 1024 * 1025)) .build();

Ambang muat naik pelbagai bahagian menentukan ukuran, dalam bait, di mana muat naik harus dilakukan sebagai muat naik berbilang bahagian.

Amazon S3 mengenakan ukuran bahagian minimum 5 MB (untuk bahagian selain bahagian terakhir), jadi kami telah menggunakan 5 MB sebagai ambang muat naik berbilang bahagian.

3.3. Memuat naik Objek

Untuk memuat naik objek menggunakan TransferManager, kita hanya perlu memanggil fungsi muat naiknya () . Ini memuat naik bahagian selari:

String bucketName = "baeldung-bucket"; String keyName = "my-picture.jpg"; String file = new File("documents/my-picture.jpg"); Upload upload = tm.upload(bucketName, keyName, file);

TransferManager.upload () mengembalikan objek Upload . Ini boleh digunakan untuk memeriksa status dan menguruskan muat naik. Kami akan melakukannya di bahagian seterusnya.

3.4. Menunggu Muat Naik Selesai

TransferManager.upload () adalah fungsi yang tidak menyekat ; ia kembali dengan segera semasa muat naik berjalan di latar belakang.

Kita boleh menggunakan objek Upload yang dikembalikan untuk menunggu muat naik selesai sebelum keluar dari program:

try { upload.waitForCompletion(); } catch (AmazonClientException e) { // ... }

3.5. Menjejaki Kemajuan Muat Naik

Jejak kemajuan muat naik adalah syarat biasa; kita boleh melakukannya dengan bantuan contoh P rogressListener :

ProgressListener progressListener = progressEvent -> System.out.println( "Transferred bytes: " + progressEvent.getBytesTransferred()); PutObjectRequest request = new PutObjectRequest( bucketName, keyName, file); request.setGeneralProgressListener(progressListener); Upload upload = tm.upload(request);

The ProgressListener kita dicipta hanya akan terus mencetak bilangan bait dipindahkan sehingga selesai muat naik.

3.6. Mengawal Paralelisme Muat Naik

Secara lalai, TransferManager menggunakan maksimum sepuluh utas untuk melakukan muat naik berbilang bahagian.

Walau bagaimanapun, kami dapat mengawalnya dengan menentukan ExecutorService semasa membina TransferManager :

int maxUploadThreads = 5; TransferManager tm = TransferManagerBuilder.standard() .withS3Client(amazonS3) .withMultipartUploadThreshold((long) (5 * 1024 * 1025)) .withExecutorFactory(() -> Executors.newFixedThreadPool(maxUploadThreads)) .build();

Di sini, kami menggunakan lambda untuk membuat implementasi wrapper ExecutorFactory dan meneruskannya ke fungsiExecutorFactory () .

4. Kesimpulan

Dalam artikel ringkas ini, kami belajar bagaimana melakukan muat naik berbilang bahagian menggunakan SDK AWS untuk Java, dan kami melihat bagaimana untuk mengawal beberapa aspek muat naik dan untuk mengetahui perkembangannya.

Seperti biasa, kod lengkap artikel ini terdapat di GitHub.