Unggahan Multibagian di Amazon S3 dengan Java

1. Ikhtisar

Dalam tutorial ini, kita akan melihat cara menangani unggahan multi bagian di Amazon S3 dengan AWS Java SDK.

Sederhananya, dalam unggahan multi-bagian, kami membagi konten menjadi bagian-bagian yang lebih kecil dan mengunggah setiap bagian satu per satu. Semua bagian dirakit kembali saat diterima.

Unggahan multibagian menawarkan keuntungan berikut:

  • Throughput lebih tinggi - kita dapat mengunggah bagian secara paralel
  • Pemulihan kesalahan yang lebih mudah - kami hanya perlu mengunggah ulang bagian yang gagal
  • Jeda dan lanjutkan unggahan - kami dapat mengunggah bagian kapan saja. Seluruh proses dapat dihentikan sementara dan bagian yang tersisa dapat diunggah nanti

Perhatikan bahwa saat menggunakan unggahan multibagian dengan Amazon S3, setiap bagian kecuali bagian terakhir harus berukuran setidaknya 5 MB.

2. Ketergantungan Maven

Sebelum memulai, kami perlu menambahkan dependensi AWS SDK di proyek kami:

 com.amazonaws aws-java-sdk 1.11.290 

Untuk melihat versi terbaru, lihat Maven Central.

3. Melakukan Unggahan Multibagian

3.1. Membuat Klien Amazon S3

Pertama, kita perlu membuat klien 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 klien menggunakan rantai penyedia kredensial default untuk mengakses kredensial AWS.

Untuk detail selengkapnya tentang cara kerja rantai penyedia kredensial default, lihat dokumentasi. Jika Anda menggunakan wilayah selain default ( US West-2 ), pastikan Anda mengganti Region.DEFAULT_REGION dengan wilayah kustom tersebut.

3.2. Membuat TransferManager untuk Mengelola Unggahan

Kami akan menggunakan TransferManagerBuilder untuk membuat instance TransferManager .

Kelas ini menyediakan API sederhana untuk mengelola unggahan dan unduhan dengan Amazon S3 dan mengelola semua tugas terkait:

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

Ambang batas unggahan multibagian menentukan ukuran, dalam byte, di atas mana unggahan harus dilakukan sebagai unggahan multibagian.

Amazon S3 memberlakukan ukuran bagian minimum 5 MB (untuk bagian selain bagian terakhir), jadi kami telah menggunakan 5 MB sebagai ambang pengunggahan multi-bagian.

3.3. Mengupload Objek

Untuk meng-upload objek menggunakan TransferManager kita hanya perlu memanggil nya meng-upload () fungsi . Ini mengunggah bagian-bagian secara paralel:

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 dapat digunakan untuk memeriksa status dan mengelola unggahan. Kami akan melakukannya di bagian selanjutnya.

3.4. Menunggu Pengunggahan Selesai

TransferManager.upload () adalah fungsi non-pemblokiran ; itu segera kembali saat unggahan berjalan di latar belakang.

Kita dapat menggunakan objek Unggah yang dikembalikan untuk menunggu unggahan selesai sebelum keluar dari program:

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

3.5. Melacak Kemajuan Unggahan

Melacak kemajuan unggahan merupakan persyaratan yang cukup umum; kita dapat 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 buat hanya akan terus mencetak jumlah byte yang ditransfer sampai selesai upload.

3.6. Mengontrol Paralelisme Unggahan

Secara default, TransferManager menggunakan maksimal sepuluh utas untuk melakukan unggahan multi bagian.

Namun, kita dapat mengontrol ini dengan menentukan ExecutorService saat membuat 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 pembungkus ExecutorFactory dan meneruskannya ke fungsi withExecutorFactory () .

4. Kesimpulan

Dalam artikel singkat ini, kami mempelajari cara melakukan pengunggahan multi-bagian menggunakan AWS SDK untuk Java, dan kami melihat cara mengontrol beberapa aspek pengunggahan dan untuk melacak kemajuannya.

Seperti biasa, kode lengkap artikel ini tersedia di GitHub.