

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengunggah Objek
<a name="upload-objects"></a>

Saat Anda mengunggah file ke Amazon S3, file tersebut disimpan sebagai *objek* S3. Objek terdiri dari data file dan metadata yang menjelaskan objek tersebut. Anda dapat memiliki jumlah objek tak terbatas dalam satu bucket. Sebelum Anda dapat mengunggah file ke bucket Amazon S3, Anda memerlukan izin menulis untuk bucket tersebut. Untuk informasi selengkapnya tentang izin akses, lihat [Identity and Access Management untuk Amazon S3](security-iam.md). 

Anda dapat mengunggah jenis file apa pun—gambar, cadangan, data, film, dan sebagainya—ke dalam bucket S3. Ukuran maksimum file yang dapat Anda unggah menggunakan konsol Amazon S3 adalah 160 GB. Untuk mengunggah file yang lebih besar dari 160 GB, gunakan AWS Command Line Interface (AWS CLI) AWS SDKs, atau Amazon S3 REST API.

Jika Anda mengunggah sebuah objek dengan nama kunci yang sudah ada dalam bucket yang diaktifkan dengan Penentuan Versi, Amazon S3 membuat versi lain dari objek tersebut dan bukan mengganti objek yang ada. Untuk informasi selengkapnya tentang mengaktifkan pembuatan versi, lihat. [Mengaktifkan Penentuan Versi pada bucket](manage-versioning-examples.md)

 Tergantung dari ukuran data yang Anda unggah, Amazon S3 menawarkan opsi berikut: 
+ **Unggah objek dalam satu operasi dengan menggunakan AWS SDKs, REST API, atau AWS CLI** — Dengan satu `PUT` operasi, Anda dapat mengunggah satu objek berukuran hingga 5 GB.
+ **Unggah objek tunggal menggunakan konsol Amazon S3 ****–**Dengan konsol Amazon S3, Anda dapat mengunggah objek tunggal yang berukuran hingga 160 GB. 
+ **Unggah objek dalam beberapa bagian dengan menggunakan AWS SDKs, REST API, atau AWS CLI** **—** Menggunakan operasi API unggahan multibagian, Anda dapat mengunggah satu objek besar, berukuran hingga 50 TB.

  Pengoperasian API unggahan multibagian dirancang untuk meningkatkan pengalaman pengunggahan untuk objek yang lebih besar. Anda dapat mengunggah objek dalam beberapa bagian. Bagian-bagian objek ini dapat diunggah secara mandiri, dalam urutan apa pun, dan secara paralel. Anda dapat menggunakan unggahan multipart untuk objek dari ukuran 5 MB hingga 50 TB. Untuk informasi selengkapnya, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md).

Untuk mengunggah file yang lebih besar dari 5 TB, gunakan S3 Transfer Manager di Java v1/v2, Python, atau. AWS CLI SDKs Untuk kinerja terbaik, gunakan AWS Common Runtime (CRT) terbaru dengan ini SDKs, yang telah dioptimalkan untuk pemanfaatan sumber daya yang lebih baik.

Saat mengunggah objek besar dari aliran memori, CRT menyangga setiap bagian hingga 5 GB dalam memori, membatasi keseluruhan throughput dengan memori yang dialokasikan. Anda dapat menyesuaikan batas memori CRT menggunakan opsi konfigurasi seperti `maxNativeMemoryLimitInBytes` untuk Java SDK. Untuk unggahan dari disk, CRT secara otomatis beralih ke streaming disk langsung alih-alih buffering bagian menengah, meningkatkan penggunaan memori. Perilaku ini secara otomatis diaktifkan untuk objek besar, tetapi juga dapat diaktifkan untuk file yang lebih kecil melalui parameter permintaan seperti `should_stream` untuk AWS CLI dan `CRT_MEMORY_BUFFER_DISABLED` untuk Java SDK.

Saat Anda mengunggah sebuah objek, objek secara otomatis dienkripsi menggunakan enkripsi di sisi server dengan kunci terkelola Amazon S3 (SSE-S3) secara default. Saat Anda mengunduhnya, objek tersebut didekripsi. Untuk informasi selengkapnya, lihat [Mengatur perilaku enkripsi sisi server default untuk bucket Amazon S3](bucket-encryption.md) dan [Melindungi data dengan enkripsi](UsingEncryption.md). 

Saat mengunggah objek, jika ingin menggunakan jenis enkripsi default yang berbeda, Anda juga dapat menentukan enkripsi sisi server dengan AWS Key Management Service (AWS KMS) kunci (SSE-KMS) dalam `PUT` permintaan S3 atau mengatur konfigurasi enkripsi default di bucket tujuan untuk menggunakan SSE-KMS untuk mengenkripsi data Anda. Untuk informasi lebih lanjut tentang SSE-KMS, lihat [Menentukan enkripsi sisi server dengan (SSE-KMS) AWS KMS](specifying-kms-encryption.md). Jika Anda ingin menggunakan kunci KMS yang dimiliki oleh akun lain, Anda harus memiliki izin untuk menggunakan kunci tersebut. Untuk informasi selengkapnya tentang izin lintas akun untuk kunci KMS, lihat [Membuat kunci KMS yang dapat digunakan oleh akun lain](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console) di *Panduan Pengembang AWS Key Management Service *. 

Jika Anda menemukan kesalahan Akses Ditolak (403 Terlarang) di Amazon S3, [Memecahkan masalah kesalahan akses ditolak (403 Forbidden) di Amazon S3](troubleshoot-403-errors.md) lihat untuk mempelajari lebih lanjut tentang penyebab umumnya.

## Mengunggah objek
<a name="upload-objects-procedure"></a>

### Menggunakan konsol S3
<a name="upload-objects-by-drag-and-drop"></a>

Prosedur ini menjelaskan cara untuk mengunggah objek dan folder ke bucket Amazon S3 menggunakan konsol tersebut. 

Ketika Anda mengunggah objek, nama kunci objek adalah nama file dan prefiks opsional. Di konsol Amazon S3, Anda dapat membuat folder untuk mengatur objek Anda. Di Amazon S3, folder diwakili sebagai prefiks yang muncul dalam nama kunci objek. Jika Anda mengunggah objek individu ke folder di konsol Amazon S3, nama folder disertakan dalam nama kunci objek. 

Misalnya, jika Anda mengunggah sebuah objek bernama `sample1.jpg` ke folder bernama `backup`, nama kuncinya adalah `backup/sample1.jpg`. Namun, objek ditampilkan di konsol sebagai `sample1.jpg` dalam folder `backup`. Untuk informasi selengkapnya tentang nama kunci, lihat [Bekerja dengan metadata objek](UsingMetadata.md).

**catatan**  
Jika Anda mengganti sebuah objek atau mengubah properti apa pun di konsol Amazon S3, misalnya **Kelas Penyimpanan**, **Enkripsi**, atau **Metadata**, sebuah objek baru dibuat untuk menggantikan yang lama. Jika Penentuan Versi S3 diaktifkan, versi baru objek akan dibuat, dan objek yang sudah ada menjadi versi yang lebih lama. Peran yang mengubah properti juga menjadi pemilik objek baru (atau versi objek).

Saat Anda mengunggah folder, Amazon S3 mengunggah semua file dan subfolder dari folder yang ditentukan ke bucket Anda. Kode tersebut kemudian menetapkan nama kunci objek yang merupakan kombinasi nama file unggahan dan nama folder. Misalnya, jika Anda mengunggah folder bernama `/images` yang berisi dua file, `sample1.jpg` dan `sample2.jpg`, Amazon S3 mengunggah file tersebut dan kemudian menetapkan nama kunci yang sesuai, `images/sample1.jpg` dan `images/sample2.jpg`. Nama-nama kunci termasuk nama folder sebagai prefiks. Konsol Amazon S3 hanya menampilkan bagian dari nama kunci yang mengikuti `/` yang terakhir. Misalnya, dalam folder `images`, objek `images/sample1.jpg` dan `images/sample2.jpg` ditampilkan sebagai `sample1.jpg` dan `sample2.jpg`.<a name="upload-files-folders"></a>

**Untuk mengunggah file dan folder ke bucket S3**

1. Masuk ke Konsol Manajemen AWS dan buka konsol Amazon S3 di. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)

1. Di panel navigasi kiri, pilih **Bucket**.

1. Di dalam daftar **Bucket**, pilih nama bucket tempat Anda ingin mengunggah folder dan file.

1. Pilih **Unggah**.

1. Di jendela **Unggah**, lakukan salah satu hal berikut: 
   + Seret dan jatuhkan file dan folder ke jendela **Unggah**.
   + Pilih **Tambahkan file** atau **Tambahkan folder**, pilih file atau folder untuk diunggah, dan pilih **Buka**.

1. Untuk mengaktifkan Penentuan Versi, di bawah **Tujuan** memilih **Aktifkan Penentuan Versi Bucket**.

1. Untuk mengunggah file dan folder yang terdaftar tanpa mengonfigurasi opsi pengunggahan tambahan, di bagian bawah halaman, pilih **Unggah**.

   Amazon S3 mengunggah objek dan folder Anda. Setelah unggahan selesai, Anda melihat pesan sukses di halaman **Unggahan: status**.<a name="configure-additional-properties"></a>

**Untuk mengonfigurasi properti objek tambahan**

1. Untuk mengubah izin daftar kontrol akses, pilih **Izin**.

1. Di bagian bawah **Daftar kontrol akses (ACL)**, edit izinnya.

   Untuk informasi selengkapnya tentang izin akses objek, lihat [Menggunakan konsol S3 untuk mengatur izin ACL untuk objek](managing-acls.md#set-object-permissions). Anda dapat memberikan akses baca ke objek Anda kepada publik (semua orang di dunia) untuk semua file yang Anda unggah. Namun, kami merekomendasikan untuk tidak mengubah pengaturan default untuk mengakses baca publik. Pemberian akses baca publik berlaku untuk sebagian kecil kasus penggunaan, seperti saat bucket digunakan untuk situs web. Anda dapat selalu mengubah izin objek setelah Anda mengunggah objek. 

1. Untuk mengonfigurasi properti tambahan lainnya, pilih **Properti**.

1. Di bagian bawah **Kelas penyimpanan** pilih kelas penyimpanan untuk file yang Anda unggah.

   Untuk informasi selengkapnya tentang kelas penyimpanan, lihat [Memahami dan mengelola kelas penyimpanan Amazon S3](storage-class-intro.md).

1. Untuk memperbarui pengaturan enkripsi untuk objek Anda, di bagian bawah **Pengaturan enkripsi di sisi server**, lakukan hal berikut.

   1. Pilih **Tentukan kunci enkripsi**.

   1. Di bawah **Pengaturan enkripsi**, pilih **Gunakan pengaturan bucket untuk enkripsi default**, atau **Ganti pengaturan bucket untuk enkripsi default**.

   1. Jika Anda memilih **Ganti pengaturan bucket untuk enkripsi default**, Anda harus mengonfigurasi pengaturan enkripsi berikut.
      + Untuk mengenkripsi file yang diunggah dengan menggunakan kunci yang dikelola oleh Amazon S3, pilih **Kunci yang dikelola Amazon S3 (SSE-S3)**.

        Untuk informasi selengkapnya, lihat [Menggunakan enkripsi di sisi server dengan kunci terkelola Amazon S3 (SSE-S3)](UsingServerSideEncryption.md).
      + Untuk mengenkripsi file yang diunggah dengan menggunakan kunci yang disimpan di AWS Key Management Service (AWS KMS), pilih **AWS Key Management Service kunci (SSE-KMS**). Lalu pilih salah satu opsi berikut ini untuk **kunci AWS KMS **:
        + Untuk memilih dari daftar kunci KMS yang tersedia, pilih **Pilih dari AWS KMS keys Anda**, dan pilih **Kunci KMS** Anda dari daftar kunci yang tersedia.

          Kunci Kunci yang dikelola AWS (`aws/s3`) dan kunci terkelola pelanggan Anda muncul dalam daftar ini. Untuk informasi selengkapnya tentang CMK, lihat [Kunci pelanggan dan AWS kunci](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt) di *AWS Key Management Service Panduan Pengembang*.
        + Untuk memasukkan ARN kunci KMS, pilih **Masukkan AWS KMS key ARN**, lalu masukkan ARN kunci KMS Anda di bidang yang muncul. 
        + Untuk membuat kunci terkelola pelanggan baru di AWS KMS konsol, pilih **Buat kunci KMS**.

          Untuk informasi selengkapnya tentang membuat AWS KMS key, lihat [Membuat kunci](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html) di *Panduan AWS Key Management Service Pengembang*.
**penting**  
Anda hanya dapat menggunakan tombol KMS yang tersedia Wilayah AWS sama dengan bucket. Konsol Amazon S3 hanya mencantumkan kunci 100 KMS pertama di Wilayah yang sama dengan bucket. Untuk menggunakan kunci KMS yang tidak terdaftar, Anda harus memasukkan ARN kunci KMS Anda. Jika Anda ingin menggunakan kunci KMS yang dimiliki oleh akun lain, Anda harus terlebih dahulu memiliki izin untuk menggunakan kunci tersebut, dan kemudian Anda harus memasukkan ARN kunci KMS.   
Amazon S3 hanya mendukung kunci KMS enkripsi simetris, dan tidak mendukung kunci KMS asimetris. Untuk informasi selengkapnya, lihat [Mengidentifikasi tombol KMS simetris dan asimetris](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html) dalam *Panduan Pengembang AWS Key Management Service *.

1. Untuk menggunakan checksum tambahan, pilih **Aktif**. Kemudian untuk **Fungsi checksum**, pilih fungsi yang ingin Anda gunakan. Amazon S3 menghitung dan menyimpan nilai checksum setelah menerima objek secara keseluruhan. Anda dapat menggunakan kotak **Nilai prakalkulasi** untuk memberikan nilai yang telah dihitung sebelumnya. Jika sudah, Amazon S3 membandingkan nilai yang Anda berikan dengan nilai yang dihitung. Jika kedua nilai tidak cocok, Amazon S3 menghasilkan kesalahan.

   Checksum tambahan memungkinkan Anda menentukan algoritma checksum yang ingin Anda gunakan untuk memverifikasi data Anda. Untuk informasi selengkapnya tentang checksum tambahan, lihat [Memeriksa integritas objek di Amazon S3](checking-object-integrity.md).

1. Untuk menambahkan tanda ke semua objek yang Anda unggah, pilih **Tambahkan tag**. Masukkan nama tag di bidang **Kunci**. Masukkan nilai untuk tanda.

   Penandaan objek memberi Anda cara untuk mengategorikan penyimpanan. Setiap tag adalah pasangan nilai kunci. Kunci dan nilai tag peka huruf besar dan kecil. Anda dapat membuat hingga 10 tanda per objek. Kunci tanda dapat terdiri dari hingga 128 karakter Unicode, dan nilai tanda dapat terdiri dari hingga 256 karakter Unicode. Untuk informasi selengkapnya tentang tag objek, lihat [Mengkategorikan objek Anda menggunakan tag](object-tagging.md).

1. Untuk menambahkan metadata, pilih **Tambahkan metadata**.

   1. Di bawah **Jenis**, pilih **Ditentukan sistem** atau **Ditentukan pengguna**.

      Untuk metadata yang ditentukan sistem, Anda dapat memilih header HTTP umum, seperti **Jenis Konten** dan **Konten-Disposisi**. Untuk daftar metadata yang ditentukan sistem, serta informasi tentang apakah Anda dapat menambahkan nilai, lihat [Metadata objek yang ditentukan sistem](UsingMetadata.md#SysMetadata). Metadata apa pun yang dimulai dengan prefiks `x-amz-meta-` diperlakukan sebagai metadata yang ditentukan pengguna. Metadata yang ditentukan pengguna disimpan bersama objek, dan dikembalikan saat Anda mengunduh objek tersebut. Baik kunci maupun nilainya harus sesuai dengan standar US-ASCII. Metadata yang ditentukan pengguna dapat berukuran sebesar 2 KB. Untuk informasi selengkapnya tentang metadata yang ditentukan sistem dan yang ditentukan pengguna, lihat [Bekerja dengan metadata objek](UsingMetadata.md).

   1. Untuk **Kunci**, pilih kuncinya.

   1. Ketikkan nilai untuk kunci tersebut. 

1. Untuk mengunggah objek Anda, pilih **Unggah**.

   Amazon S3 mengunggah objek Anda. Setelah unggahannya selesai, Anda dapat melihat pesan sukses di halaman **Unggah: status**.

1. Pilih **Keluar**.

### Menggunakan AWS CLI
<a name="UploadObjSingleOpCLI"></a>

Anda dapat mengirim permintaan `PUT` untuk mengunggah objek hingga 5 GB dalam satu operasi. Untuk informasi dan contoh selengkapnya, lihat contoh [https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html#examples](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html#examples) di *AWS CLI Referensi Perintah*.

### Penggunaan API REST
<a name="UploadObjSingleOpREST"></a>

Anda dapat mengirim permintaan REST untuk mengunggah sebuah objek. Anda dapat mengirim permintaan `PUT` untuk mengunggah dalam satu operasi. Untuk informasi lebih lanjut, lihat [PUT Objek](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html).

### Menggunakan AWS SDKs
<a name="UploadInSingleOp"></a>

Untuk contoh cara mengunggah objek dengan AWS SDKs, lihat [Contoh Kode](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_PutObject_section.html) di *Referensi API Amazon Simple Storage Service*.

Untuk informasi umum tentang penggunaan yang berbeda AWS SDKs, lihat [Mengembangkan dengan Amazon S3 menggunakan AWS SDKs Referensi](https://docs.aws.amazon.com/AmazonS3/latest/API/sdk-general-information-section.html) *API Layanan Penyimpanan Sederhana Amazon*.

## Mencegah mengunggah objek dengan nama kunci yang identik
<a name="upload-objects-with-same-key-name"></a>

Anda dapat memeriksa keberadaan objek di bucket Anda sebelum membuatnya menggunakan penulisan bersyarat pada operasi unggahan. Ini dapat mencegah penimpaan data yang ada. Penulisan bersyarat akan memvalidasi tidak ada objek yang ada dengan nama kunci yang sama yang sudah ada di bucket Anda saat mengunggah.

Anda dapat menggunakan penulisan bersyarat untuk [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)atau [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)permintaan.

Untuk informasi selengkapnya tentang permintaan bersyarat, lihat,[Tambahkan prasyarat ke operasi S3 dengan permintaan bersyarat](conditional-requests.md).

# Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3
<a name="mpuoverview"></a>

Unggahan multipart memungkinkan Anda mengunggah satu objek ke Amazon S3 sebagai satu set bagian. Setiap bagian merupakan bagian data objek yang saling berkaitan. Anda dapat mengunggah bagian objek ini secara independen, dan dalam urutan apa pun. Untuk unggahan, AWS klien Anda yang diperbarui secara otomatis menghitung checksum objek dan mengirimkannya ke Amazon S3 bersama dengan ukuran objek sebagai bagian dari permintaan. Jika ada transmisi bagian mana pun yang gagal, Anda dapat mentransmisikan ulang bagian tersebut tanpa memengaruhi bagian lainnya. Setelah semua bagian objek Anda diunggah, Amazon S3 merakitnya untuk membuat objek. Ini adalah praktik terbaik untuk menggunakan unggahan multipart untuk objek yang 100 MB atau lebih besar daripada mengunggahnya dalam satu operasi.

Penggunaan unggahan multibagian memberikan keuntungan sebagai berikut:
+ **Peningkatan throughput**–Anda dapat mengunggah bagian-bagian secara paralel untuk meningkatkan throughput. 
+ **Pemulihan yang cepat dari masalah jaringan apa pun**–Ukuran bagian yang lebih kecil meminimalkan dampak pengunggahan ulang karena kesalahan jaringan.
+ **Jeda dan pelanjutan pengunggahan objek**–Anda dapat mengunggah bagian-bagian objek kapan saja. Setelah Anda memulai unggahan multibagian, tidak ada kedaluwarsa; Anda harus secara eksplisit menyelesaikan atau menghentikan unggahan multibagian.
+ **Mulai unggahan sebelum Anda mengetahui ukuran objek akhir** — Anda dapat mengunggah objek saat Anda membuatnya. 

Kami menyarankan agar Anda menggunakan unggahan multibagian dengan cara berikut:
+ Jika Anda mengunggah objek besar melalui jaringan bandwidth tinggi yang stabil, gunakan unggahan multipart untuk memaksimalkan penggunaan bandwidth yang tersedia dengan mengunggah bagian objek secara paralel untuk kinerja multi-threaded.
+ Jika Anda mengunggah melalui jaringan jerawatan, gunakan unggahan multibagian untuk meningkatkan ketahanan terhadap kesalahan jaringan dengan menghindari pengunggahan dimulai ulang. Saat menggunakan unggahan multibagian, Anda hanya perlu mencoba mengunggah kembali bagian yang terputus selama pengunggahan. Anda tidak perlu mengunggah ulang objek Anda dari awal.

**catatan**  
Untuk informasi selengkapnya tentang menggunakan kelas penyimpanan Amazon S3 Express One Zone dengan bucket direktori, lihat [S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) dan [Bekerja dengan bucket direktori](directory-buckets-overview.md). Untuk informasi selengkapnya tentang penggunaan unggahan multibagian dengan S3 Express One Zone dan bucket direktori, lihat [Menggunakan unggahan multibagian dengan bucket direktori](s3-express-using-multipart-upload.md).

## Proses pengunggahan multibagian
<a name="mpu-process"></a>

Unggahan multipart adalah proses tiga langkah: Anda memulai unggahan, mengunggah bagian objek, dan—setelah mengunggah semua bagian—menyelesaikan unggahan multipart. Setelah menerima permintaan upload multipart lengkap, Amazon S3 membuat objek dari bagian yang diunggah, dan Anda dapat mengakses objek seperti halnya objek lain di bucket Anda. 

Anda dapat membuat daftar semua unggahan multibagian yang sedang berlangsung, atau mendapatkan daftar bagian yang telah Anda unggah untuk unggahan multibagian tertentu. Setiap operasi ini dijelaskan dalam bagian ini.

**Menginisiasi unggahan multibagian**  
Saat Anda mengirim permintaan untuk memulai unggahan multipart, pastikan untuk menentukan jenis checksum. Amazon S3 kemudian akan mengembalikan respons dengan ID unggahan, yang merupakan pengenal unik untuk unggahan multipart Anda. ID unggahan ini diperlukan saat Anda mengunggah suku cadang, mencantumkan bagian, menyelesaikan unggahan, atau menghentikan unggahan. Jika Anda ingin memberikan metadata yang menjelaskan objek yang sedang diunggah, Anda harus menyediakannya dalam permintaan untuk memulai unggahan multipart. Pengguna anonim tidak dapat memulai unggahan multipart.

**Pengunggahan bagian-bagian**  
Saat mengunggah bagian, Anda harus menentukan nomor bagian selain ID unggahan. Anda dapat memilih nomor bagian antara 1 hingga 10.000. Nomor bagian secara unik mengidentifikasi sebuah bagian dan posisinya dalam objek yang Anda unggah. Nomor bagian yang Anda pilih tidak harus berurutan (misalnya, nomornya dapat berupa 1, 5, dan 14). Ketahuilah bahwa jika Anda mengunggah bagian baru menggunakan nomor bagian yang sama dengan bagian yang diunggah sebelumnya, bagian yang diunggah sebelumnya akan ditimpa. 

Saat Anda mengunggah bagian, Amazon S3 mengembalikan jenis algoritma checksum dengan nilai checksum untuk setiap bagian sebagai header dalam respons. Untuk setiap unggahan bagian, Anda harus mencatat nomor bagian dan ETag nilainya. Anda harus memasukkan nilai-nilai ini dalam permintaan selanjutnya untuk menyelesaikan unggahan multibagian. Setiap bagian akan memiliki sendiri ETag pada saat diunggah. Namun, setelah unggahan multipart selesai dan semua bagian dikonsolidasikan, semua bagian menjadi milik satu ETag sebagai checksum checksum.

**penting**  
Setelah Anda memulai pengunggahan multibagian dan mengunggah satu atau beberapa bagian, Anda harus menyelesaikan atau menghentikan unggahan multibagian untuk menghentikan biaya penyimpanan suku cadang yang diunggah. Hanya *setelah* Anda menyelesaikan atau menghentikan unggahan multibagian, Amazon S3 akan membebaskan penyimpanan suku cadang dan berhenti menagih Anda untuk penyimpanan suku cadang.  
Setelah menghentikan unggahan multibagian, Anda tidak dapat mengunggah bagian apa pun menggunakan ID unggahan itu lagi. Jika sebagian unggahan sedang berlangsung, mereka masih dapat berhasil atau gagal bahkan setelah Anda menghentikan unggahan. Untuk memastikan Anda membebaskan semua penyimpanan yang dikonsumsi oleh semua bagian, Anda harus menghentikan unggahan multibagian hanya setelah semua unggahan bagian selesai.

**Penyelesaian unggahan multibagian**  
Saat Anda menyelesaikan unggahan multibagian, Amazon S3 membuat objek dengan menggabungkan bagian-bagian dalam urutan menaik berdasarkan nomor bagian. Jika metadata objek disediakan dalam permintaan *mulai unggahan multibagian*, Amazon S3 akan mengaitkan metadatanya dengan objek tersebut. Setelah permintaan *selesai* sepenuhnya, bagiantersebut tidak akan ada lagi. 

Permintaan *pengunggahan multibagian lengkap* Anda harus menyertakan ID unggahan dan daftar nomor bagian serta ETag nilainya yang sesuai. Respons Amazon S3 mencakup ETag yang secara unik mengidentifikasi data objek gabungan. ETag Ini belum tentu MD5 hash dari data objek.

Saat Anda memberikan checksum objek lengkap selama pengunggahan multibagian, AWS SDK meneruskan checksum ke Amazon S3, dan S3 memvalidasi sisi server integritas objek, membandingkannya dengan nilai yang diterima. Kemudian, S3 menyimpan objek jika nilainya cocok. Jika kedua nilai tidak cocok, Amazon S3 gagal permintaan dengan `BadDigest` kesalahan. Checksum objek Anda juga disimpan dalam metadata objek yang nantinya akan Anda gunakan untuk memvalidasi integritas data objek. 

**Contoh panggilan unggahan multibagian**  
 Untuk contoh ini, asumsikan bahwa Anda membuat unggahan multipart untuk file 100 GB. Dalam hal ini, Anda akan memiliki panggilan API berikut untuk seluruh proses. Akan ada total 1.002 panggilan API. 
+ Panggilan `[CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)` untuk memulai proses.
+ 1.000 `[UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)` panggilan individu, masing-masing mengunggah bagian dari 100 MB, dengan ukuran total 100 GB.
+ `[CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)`Panggilan untuk menyelesaikan proses.

**Pendaftaran unggahan multibagian**  
Anda dapat mendaftar bagian-bagian dari unggahan multibagian tertentu atau semua unggahan multibagian yang sedang berlangsung. Operasi bagian daftar mengembalikan informasi bagian yang Anda unggah untuk unggahan multibagian tertentu. Untuk setiap permintaan daftar bagian, Amazon S3 akan menampilkan informasi bagian untuk unggahan multibagian tertentu, hingga maksimum 1.000 bagian. Jika ada lebih dari 1.000 bagian dalam unggahan multipart, Anda harus mengirim serangkaian permintaan bagian daftar untuk mengambil semua bagian. Perhatikan bahwa daftar bagian yang ditampilkan tidak mencakup bagian yang belum selesai diunggah. Dengan menggunakan operasi *daftar unggahan multibagian*, Anda dapat memperoleh daftar unggahan multibagian yang sedang berlangsung.

Unggahan multibagian yang sedang berlangsung adalah unggahan yang telah Anda mulai, tetapi belum selesai atau dihentikan. Setiap permintaan akan ditampilkan sebanyak maksimum 1.000 unggahan multibagian. Jika ada lebih dari 1.000 unggahan multibagian yang sedang berlangsung, Anda harus mengirim permintaan tambahan untuk mengambil unggahan multibagian yang tersisa. Gunakan pendaftaran yang ditampilkan untuk verifikasi.

**penting**  
Jangan menggunakan hasil pendaftaran ini saat mengirim permintaan *selesaikan unggahan multibagian*. Sebagai gantinya, pertahankan daftar nomor bagian Anda sendiri yang Anda tentukan saat mengunggah bagian dan ETag nilai terkait yang dikembalikan Amazon S3.

## Checksum dengan operasi unggahan multibagian
<a name="mpuchecksums"></a>

Saat mengunggah sebuah objek ke Amazon S3, Anda dapat menentukan algoritma checksum untuk Amazon S3 untuk digunakan. Secara default, konsol AWS SDK dan S3 menggunakan algoritme untuk semua unggahan objek, yang dapat Anda timpa. Jika Anda menggunakan SDK yang lebih lama dan objek yang diunggah tidak memiliki checksum yang ditentukan, Amazon S3 secara otomatis menggunakan algoritma checksum CRC-64/NVME (). `CRC64NVME` (Ini juga merupakan opsi yang disarankan untuk verifikasi integritas data yang efisien.) Saat menggunakan CRC-64/NVME, Amazon S3 menghitung checksum objek lengkap setelah unggahan multipart atau satu bagian selesai. Algoritma checksum CRC-64/NVME digunakan untuk menghitung checksum langsung dari seluruh objek, atau checksum checksum, untuk setiap bagian individu.

Setelah Anda mengunggah objek ke S3 menggunakan unggahan multipart, Amazon S3 menghitung nilai checksum untuk setiap bagian, atau untuk objek lengkap—dan menyimpan nilainya. Anda dapat menggunakan S3 API atau AWS SDK untuk mengambil nilai checksum dengan cara berikut:
+ Untuk masing-masing bagian, Anda dapat menggunakan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)atau [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html). Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian dari unggahan multibagian saat masih dalam proses, Anda dapat menggunakannya. [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)
+ Untuk seluruh objek, Anda dapat menggunakan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html). Jika Anda ingin melakukan upload multipart dengan checksum objek lengkap, gunakan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload)dan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload)dengan menentukan jenis checksum objek lengkap. Untuk memvalidasi nilai checksum dari seluruh objek atau untuk mengonfirmasi jenis checksum mana yang digunakan dalam unggahan multipart, gunakan. [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)

**penting**  
Jika Anda menggunakan unggahan multibagian dengan **Checksum**, nomor bagian untuk setiap unggahan bagian (dalam unggahan multibagian) harus menggunakan nomor bagian berturut-turut dan dimulai dengan 1. Saat menggunakan **Checksum**, jika Anda mencoba menyelesaikan permintaan unggahan multibagian dengan nomor bagian yang tidak berurutan, Amazon S3 menghasilkan kesalahan. `HTTP 500 Internal Server`

 Untuk informasi selengkapnya tentang cara kerja checksum dengan objek unggahan multibagian, lihat. [Memeriksa integritas objek di Amazon S3](checking-object-integrity.md)

Untuk end-to-end prosedur yang menunjukkan cara mengunggah objek menggunakan unggahan multipart dengan checksum tambahan, lihat. [Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya](tutorial-s3-mpu-additional-checksums.md)

## Operasi pengunggahan multibagian serentak
<a name="distributedmpupload"></a>

Dalam lingkungan pengembangan terdistribusi, aplikasi Anda dapat memulai beberapa pembaruan pada objek yang sama secara bersamaan. Aplikasi Anda dapat memulai beberapa unggahan multibagian menggunakan kunci objek yang sama. Untuk setiap unggahan ini, aplikasi Anda kemudian dapat mengunggah bagian dan mengirim sebuah permintaan menyelesaikan unggahan ke Amazon S3 untuk membuat objek. Jika Penentuan Versi S3 diaktifkan pada bucket, menyelesaikan pengunggahan multibagian akan selalu membuat versi baru. Saat Anda memulai beberapa unggahan multibagian yang menggunakan kunci objek yang sama dalam bucket berkemampuan versi, versi objek saat ini ditentukan oleh pengunggahan yang paling baru dimulai (). `createdDate`

Misalnya, Anda memulai `CreateMultipartUpload` permintaan objek pada pukul 10:00 pagi. Kemudian, Anda mengirimkan `CreateMultipartUpload` permintaan kedua untuk objek yang sama pada pukul 11:00. Karena permintaan kedua dikirimkan paling baru, objek yang diunggah oleh permintaan 11:00 AM menjadi versi saat ini, bahkan jika unggahan pertama selesai setelah yang kedua. Untuk bucket yang tidak mengaktifkan versi, ada kemungkinan permintaan lain yang diterima antara waktu saat unggahan multibagian dimulai dan saat selesai, permintaan lainnya mungkin diutamakan.

Contoh lain ketika permintaan upload multipart bersamaan dapat diutamakan adalah jika operasi lain menghapus kunci setelah Anda memulai unggahan multipart dengan kunci tersebut. Sebelum Anda menyelesaikan operasi, respons unggahan multibagian lengkap mungkin menunjukkan pembuatan objek yang berhasil tanpa Anda pernah melihat objek. 

## Mencegah mengunggah objek dengan nama kunci yang identik selama pengunggahan multipart
<a name="multipart-upload-objects-with-same-key-name"></a>

Anda dapat memeriksa keberadaan objek di bucket Anda sebelum membuatnya menggunakan penulisan bersyarat pada operasi unggahan. Ini dapat mencegah penimpaan data yang ada. Penulisan bersyarat akan memvalidasi bahwa tidak ada objek yang ada dengan nama kunci yang sama yang sudah ada di bucket Anda saat mengunggah.

Anda dapat menggunakan penulisan bersyarat untuk [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)atau [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)permintaan.

Untuk informasi selengkapnya tentang permintaan bersyarat, lihat,[Tambahkan prasyarat ke operasi S3 dengan permintaan bersyarat](conditional-requests.md).

## Unggahan multibagian dan harga
<a name="mpuploadpricing"></a>

Setelah Anda memulai unggahan multibagian, Amazon S3 akan menyimpan semua bagian hingga Anda menyelesaikan atau menghentikan unggahan. Sepanjang masa pakainya, Anda akan ditagih untuk semua penyimpanan, bandwidth, dan permintaan untuk unggahan multibagian ini dan bagian terkaitnya. 

Bagian-bagian ini ditagih sesuai dengan kelas penyimpanan yang ditentukan saat bagian diunggah. Namun, Anda tidak akan ditagih untuk suku cadang ini jika diunggah ke S3 Glacier Flexible Retrieval atau S3 Glacier Deep Archive. Suku cadang multipart yang sedang berlangsung untuk permintaan PUT ke kelas penyimpanan S3 Glacier Flexible Retrieval ditagih sebagai penyimpanan staging S3 Glacier Flexible Retrieval dengan kecepatan penyimpanan Standar S3 hingga pengunggahan selesai. Selain itu, keduanya `CreateMultipartUpload` dan `UploadPart` ditagih dengan tarif Standar S3. Hanya `CompleteMultipartUpload` permintaan yang ditagih dengan tarif Pengambilan Fleksibel S3 Glacier. Demikian pula, suku cadang multipart yang sedang berlangsung untuk kelas penyimpanan PUT ke S3 Glacier Deep Archive ditagih sebagai penyimpanan pementasan Pengambilan Fleksibel Gletser S3 pada tingkat penyimpanan Standar S3 hingga unggahan selesai, dengan hanya permintaan yang dikenakan tarif S3 Glacier Deep Archive. `CompleteMultipartUpload`

Jika Anda menghentikan pengunggahan multibagian, Amazon S3 menghapus artefak unggahan dan semua bagian yang Anda unggah. Anda tidak akan ditagih untuk artefak itu. Tidak ada biaya penghapusan awal untuk menghapus unggahan multibagian yang belum selesai terlepas dari kelas penyimpanan yang ditentukan. Untuk informasi selengkapnya tentang harga, lihat [Harga Amazon S3](https://aws.amazon.com/s3/pricing/).

**catatan**  
Untuk meminimalkan biaya penyimpanan, kami menyarankan untuk Anda mengonfigurasi aturan siklus hidup untuk menghapus unggahan multibagian yang tidak lengkap setelah beberapa hari tertentu dengan menggunakan tindakan `AbortIncompleteMultipartUpload`. Untuk informasi selengkapnya tentang membuat aturan siklus hidup untuk menghapus unggahan multibagian yang tidak lengkap, lihat [Mengonfigurasi konfigurasi siklus hidup bucket untuk menghapus unggahan multibagian yang tidak lengkap](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html).

## Dukungan API untuk unggahan multibagian
<a name="apisupportformpu"></a>

Bagian berikut dalam *Referensi API Amazon Simple Storage Service* menjelaskan tentang API REST untuk unggahan multibagian. 

Untuk panduan unggahan multibagian yang menggunakan fungsi AWS Lambda, lihat [Mengunggah objek besar ke Amazon S3](https://aws.amazon.com/blogs/compute/uploading-large-objects-to-amazon-s3-using-multipart-upload-and-transfer-acceleration/) menggunakan akselerasi unggahan dan transfer multibagian.
+ [Buat Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [Unggah Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [Unggah Bagian (Salinan)](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [Selesaikan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [Batalkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html)
+ [Daftarkan Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)
+ [Daftarkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html)

## AWS Command Line Interface dukungan untuk upload multipart
<a name="clisupportformpu"></a>

Topik-topik berikut dalam AWS Command Line Interface menjelaskan operasi untuk upload multipart. 
+ [Mulai Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html)
+ [Unggah Bagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ [Unggah Bagian (Salinan)](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ [Selesaikan Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
+ [Batalkan Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
+ [Daftarkan Bagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
+ [Daftarkan Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html)

## AWS Dukungan SDK untuk unggahan multipart
<a name="sdksupportformpu"></a>



Anda dapat menggunakan AWS SDKs untuk mengunggah objek di beberapa bagian. Untuk daftar tindakan API yang AWS SDKs didukung, lihat:
+ [Buat Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [Unggah Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [Unggah Bagian (Salinan)](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [Selesaikan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [Batalkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html)
+ [Daftarkan Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)
+ [Daftarkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html)

## API dan izin unggahan multibagian
<a name="mpuAndPermissions"></a>

Anda harus memiliki izin yang diperlukan untuk menggunakan operasi pengunggahan multibagian. Anda dapat menggunakan daftar kontrol akses (ACLs), kebijakan bucket, atau kebijakan pengguna untuk memberikan izin individu untuk melakukan operasi ini. Tabel berikut mencantumkan izin yang diperlukan untuk berbagai operasi unggahan multibagian saat menggunakan ACLs, kebijakan bucket, atau kebijakan pengguna. 


| Tindakan | Izin yang diperlukan | 
| --- | --- | 
|  Buat Unggahan Multibagian  |  Anda harus diizinkan untuk melakukan `s3:PutObject` tindakan pada objek untuk membuat permintaan upload multipart.  Pemilik bucket dapat mengizinkan pengguna utama lain untuk melakukan tindakan `s3:PutObject`.   | 
|  Mulai Unggahan Multibagian  |  Anda harus diizinkan untuk melakukan `s3:PutObject` tindakan pada objek untuk memulai unggahan multipart.  Pemilik bucket dapat mengizinkan penanggung jawab lain untuk melakukan tindakan `s3:PutObject`.   | 
| Inisiator | Elemen kontainer yang mengidentifikasi siapa yang memulai unggahan multibagian. Jika inisiator adalah Akun AWS, elemen ini memberikan informasi yang sama dengan elemen Pemilik. Jika inisiator adalah seorang pengguna IAM, elemen ini akan menyediakan ARN pengguna dan nama tampilan. | 
| Unggah Bagian | Anda harus diizinkan untuk melakukan tindakan `s3:PutObject` pada sebuah objek untuk mengunggah sebuah bagian.  Pemilik bucket harus mengizinkan inisiator untuk melakukan tindakan `s3:PutObject` pada sebuah objek agar inisiator dapat mengunggah bagian untuk objek tersebut. | 
| Unggah Bagian (Salinan) | Anda harus diizinkan untuk melakukan tindakan `s3:PutObject` pada sebuah objek guna mengunggah sebuah bagian. Karena Anda mengunggah sebuah bagian dari objek yang sudah ada, Anda harus diizinkan `s3:GetObject` pada objek sumber.  Agar inisiator dapat mengunggah bagian untuk sebuah objek, pemilik bucket harus mengizinkan inisiator untuk melakukan tindakan `s3:PutObject` pada objek. | 
| Selesaikan Unggahan Multibagian | Anda harus diizinkan untuk melakukan tindakan `s3:PutObject` pada sebuah objek untuk menyelesaikan sebuah unggahan multibagian.  Pemilik bucket harus mengizinkan inisiator untuk melakukan tindakan `s3:PutObject` pada sebuah objek agar inisiator dapat menyelesaikan sebuah unggahan multibagian untuk objek tersebut. | 
| Hentikan Unggahan Multibagian | Anda harus diizinkan untuk melakukan tindakan `s3:AbortMultipartUpload` untuk menghentikan sebuah unggahan multibagian.  Secara default, pemilik bucket dan inisiator unggahan multipart diizinkan untuk melakukan tindakan ini sebagai bagian dari kebijakan bucket IAM dan S3. Jika inisiator adalah pengguna IAM, pengguna tersebut juga Akun AWS diizinkan untuk menghentikan unggahan multibagian tersebut. Dengan kebijakan titik akhir VPC, inisiator unggahan multibagian tidak secara otomatis mendapatkan izin untuk melakukan tindakan. `s3:AbortMultipartUpload` Selain pengaturan default ini, pemilik bucket dapat mengizinkan pengguna utama lain untuk melakukan tindakan `s3:AbortMultipartUpload` terhadap suatu objek. Pemilik bucket dapat menolak kemampuan pengguna utama mana pun untuk melakukan tindakan `s3:AbortMultipartUpload`. | 
| Daftarkan Bagian | Anda harus diizinkan untuk melakukan tindakan `s3:ListMultipartUploadParts` untuk mendaftar bagian dalam unggahan multibagian. Secara default, pemilik bucket memiliki izin untuk mendaftarkan bagian untuk unggahan multibagian apa pun pada bucket. Inisiator unggahan multibagian memiliki izin untuk mendaftarkan bagian-bagian dari unggahan multibagian tertentu. Jika inisiator unggahan multipart adalah pengguna IAM, Akun AWS pengendali pengguna IAM tersebut juga memiliki izin untuk membuat daftar bagian dari unggahan tersebut.  Selain pengaturan default ini, pemilik bucket dapat mengizinkan pengguna utama lain untuk melakukan tindakan `s3:ListMultipartUploadParts` terhadap suatu objek. Pemilik bucket dapat juga menolak kemampuan pengguna utama mana pun untuk melakukan tindakan `s3:ListMultipartUploadParts`. | 
| Daftarkan Unggahan Multibagian | Anda harus diizinkan untuk melakukan tindakan `s3:ListBucketMultipartUploads` pada sebuah bucket untuk mendaftar unggahan multibagian yang sedang berlangsung pada bucket tersebut. Selain pengaturan default ini, pemilik bucket dapat mengizinkan pengguna utama lain untuk melakukan tindakan `s3:ListBucketMultipartUploads` terhadap suatu objek. | 
| AWS KMS Enkripsi dan Dekripsi izin terkait |  Untuk melakukan upload multipart dengan enkripsi menggunakan kunci AWS Key Management Service (AWS KMS) KMS, pemohon harus memiliki izin berikut: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonS3/latest/userguide/mpuoverview.html)  Izin ini diperlukan karena Amazon S3 harus mendekripsi dan membaca data dari bagian file terenkripsi sebelum menyelesaikan unggahan multibagian. `kms:Decrypt`Izin, dan enkripsi sisi server dengan kunci enkripsi yang disediakan pelanggan, juga diperlukan bagi Anda untuk mendapatkan nilai checksum objek. Jika Anda tidak memiliki izin yang diperlukan ini saat menggunakan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)API, objek dibuat tanpa nilai checksum. Jika pengguna atau peran IAM Anda Akun AWS sama dengan kunci KMS, maka validasi bahwa Anda memiliki izin pada kebijakan kunci dan IAM. Jika pengguna atau peran IAM Anda memiliki akun yang berbeda dengan kunci KMS Anda, maka Anda harus memiliki izin pada kebijakan kunci maupun pengguna atau pengguna IAM Anda.  | 
| SSE-C (enkripsi sisi server dengan kunci enkripsi yang disediakan pelanggan) | Saat Anda menggunakan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)API, Anda harus menyediakan SSE-C (enkripsi sisi server dengan kunci enkripsi yang disediakan pelanggan), atau objek Anda akan dibuat tanpa checksum, dan tidak ada nilai checksum yang dikembalikan.  | 

Untuk informasi tentang hubungan antara izin ACL dan izin dalam kebijakan akses, lihat [Pemetaan izin ACL dan izin kebijakan akses](acl-overview.md#acl-access-policy-permission-mapping). Untuk informasi selengkapnya tentang pengguna IAM dan praktik terbaik, lihat [Identitas IAM (pengguna, grup pengguna, dan peran)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) di *Panduan Pengguna IAM*.

## Checksum dengan operasi unggahan multibagian
<a name="Checksums-mpu-operations"></a>

Ada tiga Amazon S3 APIs yang digunakan untuk melakukan unggahan multipart yang sebenarnya: [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html),, [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)dan. [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) Tabel berikut menunjukkan header dan nilai checksum mana yang harus disediakan untuk masing-masing: APIs


| Algoritma checksum | Jenis checksum | `CreateMultipartUpload` | `UploadPart` | `CompleteMultipartUpoad` | 
| --- | --- | --- | --- | --- | 
| CRC-64/NVME () `CRC64NVME` | Objek penuh | Header yang diperlukan: `x-amz-checksum-algorithm` |  Header opsional: `x-amz-checksum-crc64nvme`  |  Header opsional: `x-amz-checksum-algorithm` `x-amz-crc64`  | 
| CRC-32 () `CRC32` CRC 32-C () `CRC32C` | Objek penuh |  Header yang diperlukan: `x-amz-checksum-algorithm` `x-amz-checksum-type`  |  Header opsional: `x-amz-checksum-crc64nvme`  |  Header opsional: `x-amz-checksum-algorithm` `x-amz-crc32` `x-amz-crc32c`  | 
|  CRC-32 () `CRC32` CRC-32C () `CRC32C` SHA-1 () `SHA1` SHA-256 () `SHA256` | Komposit |  Header yang diperlukan: `x-amz-checksum-algorithm`  |  Header yang diperlukan: `x-amz-checksum-crc32` `x-amz-checksum-crc32c` `x-amz-checksum-sha1` `x-amz-checksum-sha256`  |  Header yang diperlukan: Semua checksum tingkat bagian harus disertakan dalam permintaan. `CompleteMultiPartUpload` Header opsional: `x-amz-crc32` `x-amz-crc32c` `x-amz-sha1` `x-amz-sha256`  | 

**Topics**
+ [

## Proses pengunggahan multibagian
](#mpu-process)
+ [

## Checksum dengan operasi unggahan multibagian
](#mpuchecksums)
+ [

## Operasi pengunggahan multibagian serentak
](#distributedmpupload)
+ [

## Mencegah mengunggah objek dengan nama kunci yang identik selama pengunggahan multipart
](#multipart-upload-objects-with-same-key-name)
+ [

## Unggahan multibagian dan harga
](#mpuploadpricing)
+ [

## Dukungan API untuk unggahan multibagian
](#apisupportformpu)
+ [

## AWS Command Line Interface dukungan untuk upload multipart
](#clisupportformpu)
+ [

## AWS Dukungan SDK untuk unggahan multipart
](#sdksupportformpu)
+ [

## API dan izin unggahan multibagian
](#mpuAndPermissions)
+ [

## Checksum dengan operasi unggahan multibagian
](#Checksums-mpu-operations)
+ [

# Mengonfigurasi siklus hidup bucket untuk menghapus unggahan multibagian yang tidak lengkap
](mpu-abort-incomplete-mpu-lifecycle-config.md)
+ [

# Pengunggahan objek menggunakan unggahan multibagian
](mpu-upload-object.md)
+ [

# Mengunggah direktori menggunakan kelas .NET tingkat tinggi TransferUtility
](HLuploadDirDotNet.md)
+ [

# Mendaftarkan unggahan multibagian
](list-mpu.md)
+ [

# Melacak unggahan multipart dengan AWS SDKs
](track-mpu.md)
+ [

# Membatalkan unggahan multibagian
](abort-mpu.md)
+ [

# Menyalin objek menggunakan unggahan multibagian
](CopyingObjectsMPUapi.md)
+ [

# Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya
](tutorial-s3-mpu-additional-checksums.md)
+ [

# Batas unggahan multibagian Amazon S3
](qfacts.md)

# Mengonfigurasi siklus hidup bucket untuk menghapus unggahan multibagian yang tidak lengkap
<a name="mpu-abort-incomplete-mpu-lifecycle-config"></a>

Sebagai praktik terbaik, kami menyarankan Anda untuk mengonfigurasi aturan siklus hidup dengan menggunakan tindakan `AbortIncompleteMultipartUpload` untuk meminimalkan biaya penyimpanan Anda. Untuk informasi lebih lanjut tentang membatalkan unggahan multibagian, lihat [Membatalkan unggahan multibagian](abort-mpu.md).

Amazon S3 mendukung aturan siklus hidup bucket yang dapat Anda gunakan untuk mengarahkan Amazon S3 menghentikan unggahan multibagian yang tidak diselesaikan dalam jumlah hari tertentu setelah prosesnya dimulai. Jika unggahan multibagian tidak selesai dalam jangka waktu yang ditentukan, unggahan tersebut memenuhi syarat untuk operasi pembatalan. Amazon S3 kemudian menghentikan unggahan multibagian dan menghapus bagian yang terkait dengan unggahan multibagian. Aturan ini berlaku untuk unggahan multibagian yang ada dan yang Anda buat nanti.

 Berikut ini adalah contoh konfigurasi siklus hidup yang menentukan aturan dengan tindakan `AbortIncompleteMultipartUpload`. 

```
<LifecycleConfiguration>
    <Rule>
        <ID>sample-rule</ID>
        <Prefix></Prefix>
        <Status>Enabled</Status>
        <AbortIncompleteMultipartUpload>
          <DaysAfterInitiation>7</DaysAfterInitiation>
        </AbortIncompleteMultipartUpload>
    </Rule>
</LifecycleConfiguration>
```

Dalam contoh ini, aturan tidak menentukan nilai untuk elemen `Prefix` ([prefiks nama kunci objek](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)). Oleh karena itu, aturan ini berlaku untuk semua objek dalam bucket tempat Anda memulai unggahan multibagian. Setiap unggahan multibagian yang dimulai dan tidak diselesaikan dalam waktu tujuh hari memenuhi syarat untuk operasi pembatalan. Tindakan membatalkan tidak memengaruhi unggahan multibagian yang sudah selesai.

Untuk informasi selengkapnya tentang konfigurasi siklus hidup bucket, lihat [Mengelola siklus hidup objek](object-lifecycle-mgmt.md).

**catatan**  
Jika unggahan multibagian selesai dalam jumlah hari yang ditentukan dalam aturan, tindakan siklus hidup `AbortIncompleteMultipartUpload` tidak berlaku lagi (yaitu, Amazon S3 tidak akan mengambil tindakan apa pun). Selain itu, tindakan ini tidak berlaku untuk objek. Tidak ada objek yang dihapus oleh tindakan siklus hidup ini. Selain itu, Anda tidak akan dikenakan biaya penghapusan awal untuk Siklus Hidup S3 saat Anda menghapus bagian unggahan multibagian yang tidak lengkap.

## Menggunakan konsol S3
<a name="mpu-abort-incomplete-mpu-lifecycle-config-console"></a>

Untuk mengelola unggahan multibagian yang tidak lengkap secara otomatis, Anda dapat menggunakan konsol S3 untuk membuat aturan siklus hidup untuk mengakhiri byte unggahan multibagian yang tidak lengkap dari bucket Anda setelah jumlah hari yang ditentukan. Prosedur berikut menunjukkan cara menambahkan aturan siklus hidup untuk menghapus unggahan multibagian yang tidak lengkap setelah 7 hari. Untuk informasi selengkapnya tentang cara menambahkan aturan siklus hidup, lihat [Menyetel konfigurasi Siklus Hidup S3 pada bucket](how-to-set-lifecycle-configuration-intro.md).

**Untuk menambahkan aturan siklus hidup untuk membatalkan unggahan multibagian yang tidak lengkap yang berumur lebih dari 7 hari**

1. Masuk ke Konsol Manajemen AWS dan buka konsol Amazon S3 di. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)

1. Di daftar **Bucket**, pilih nama bucket yang ingin Anda buatkan aturan siklus hidupnya.

1. Pilih tab **Manajemen**, dan pilih **Buat aturan siklus hidup**.

1. Di **Nama aturan siklus hidup**, masukkan nama untuk aturan Anda.

   Nama dalam bucket harus unik. 

1. Pilih cakupan aturan siklus hidup:
   + Untuk membuat aturan siklus hidup untuk semua objek dengan prefiks tertentu, pilih **Batasi cakupan aturan ini menggunakan satu atau lebih filter**, dan masukkan bidang **Prefiks**.
   + Untuk membuat aturan siklus hidup ini pada semua objek dalam bucket, pilih **Aturan ini berlaku untuk **semua** objek di dalam bucket**, lalu pilih **Saya menyatakan bahwa aturan ini berlaku untuk semua objek dalam bucket**.

1. Di bagian bawah **Tindakan aturan siklus hidup**, pilih **Hapus penanda hapus objek kedaluwarsa atau unggahan multibagian yang tidak lengkap**.

1. Di bagian bawah **Hapus penanda hapus objek kedaluwarsa atau unggahan multibagian yang tidak lengkap**, pilih **Hapus unggahan multibagian yang tidak lengkap**.

1. Di bidang **Jumlah hari**, masukkan jumlah hari setelahnya untuk menghapus unggahan multibagian yang tidak lengkap (untuk contoh ini, 7 hari). 

1. Pilih **Buat aturan**.

## Menggunakan AWS CLI
<a name="mpu-abort-incomplete-mpu-lifecycle-config-cli"></a>

Perintah berikut `put-bucket-lifecycle-configuration`AWS Command Line Interface (AWS CLI) menambahkan konfigurasi siklus hidup untuk bucket yang ditentukan. Untuk menggunakan perintah ini, ganti `user input placeholders` dengan informasi Anda.

```
aws s3api put-bucket-lifecycle-configuration  \
        --bucket amzn-s3-demo-bucket  \
        --lifecycle-configuration filename-containing-lifecycle-configuration
```

Contoh berikut menunjukkan cara menambahkan aturan siklus hidup untuk membatalkan unggahan multibagian yang tidak lengkap dengan menggunakan AWS CLI. Ini mencakup contoh konfigurasi siklus hidup JSON untuk membatalkan unggahan multibagian yang tidak lengkap yang berusia lebih dari 7 hari.

Untuk menggunakan perintah CLI dalam contoh ini, ganti `user input placeholders` dengan informasi Anda sendiri.

**Untuk menambahkan aturan siklus hidup untuk membatalkan unggahan multibagian yang tidak lengkap**

1. Mengatur AWS CLI. *Untuk petunjuknya, lihat [Mengembangkan dengan Amazon S3 menggunakan AWS CLI di Referensi API](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html) Amazon S3.* 

1. Simpan konfigurasi siklus hidup contoh berikut dalam sebuah file (misalnya, *`lifecycle.json`*``). Konfigurasi contoh ini menentukan prefiks kosong, dan karenanya berlaku untuk semua objek di bucket. Untuk membatasi konfigurasi ke subset objek, Anda dapat menentukan prefiks.

   ```
   {
       "Rules": [
           {
               "ID": "Test Rule",
               "Status": "Enabled",
               "Filter": {
                   "Prefix": ""
               },
               "AbortIncompleteMultipartUpload": {
                   "DaysAfterInitiation": 7
               }
           }
       ]
   }
   ```

1.  Jalankan perintah CLI berikut ini untuk menetapkan konfigurasi siklus hidup pada bucket Anda. 

   ```
   aws s3api put-bucket-lifecycle-configuration   \
   --bucket amzn-s3-demo-bucket  \
   --lifecycle-configuration file://lifecycle.json
   ```

1.  Untuk memverifikasi bahwa konfigurasi siklus hidup telah ditetapkan pada bucket Anda, ambil konfigurasi siklus hidup dengan menggunakan perintah `get-bucket-lifecycle` berikut. 

   ```
   aws s3api get-bucket-lifecycle  \
   --bucket amzn-s3-demo-bucket
   ```

1.  Untuk menghapus konfigurasi siklus hidup, gunakan perintah `delete-bucket-lifecycle` berikut ini. 

   ```
   aws s3api delete-bucket-lifecycle \
   --bucket amzn-s3-demo-bucket
   ```

# Pengunggahan objek menggunakan unggahan multibagian
<a name="mpu-upload-object"></a>

Anda dapat menggunakan unggahan multibagian untuk mengunggah satu objek ke Amazon S3 secara terprogram. Setiap objek diunggah sebagai satu set bagian. Setiap bagian merupakan bagian data objek yang saling berkaitan. Anda dapat mengunggah bagian-bagian objek tersebut secara independen dan dengan urutan apa pun. Jika ada transmisi bagian mana pun yang gagal, Anda dapat mentransmisikan ulang bagian tersebut tanpa memengaruhi bagian lainnya. Setelah semua bagian objek Anda diunggah, Amazon S3 merakit bagian-bagian ini dan menciptakan objek. Pengguna anonim tidak dapat memulai unggahan multipart.

Untuk end-to-end prosedur mengunggah objek dengan unggahan multipart dengan checksum tambahan, lihat. [Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya](tutorial-s3-mpu-additional-checksums.md)

Bagian berikut menunjukkan cara menggunakan upload multipart dengan AWS Command Line Interface, dan AWS SDKs.

## Menggunakan konsol S3
<a name="MultipartUploadConsole"></a>

Anda dapat mengunggah jenis file apa pun—gambar, cadangan, data, film, dan sebagainya—ke dalam bucket S3. Ukuran maksimum file yang dapat Anda unggah menggunakan konsol Amazon S3 adalah 160 GB. Untuk mengunggah file yang lebih besar dari 160 GB, gunakan AWS Command Line Interface (AWS CLI) AWS SDKs, atau Amazon S3 REST API.

Untuk petunjuk tentang mengunggah objek melalui Konsol Manajemen AWS, lihat[Mengunggah Objek](upload-objects.md).

## Menggunakan AWS CLI
<a name="UsingCLImpUpload"></a>

Berikut ini menjelaskan operasi Amazon S3 untuk unggahan multibagian menggunakan. AWS CLI
+ [Mulai Unggahan Multibagian](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-multipart-upload.html)
+ [Unggah Bagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ [Unggah Bagian (Salinan)](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ [Selesaikan Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
+ [Batalkan Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
+ [Daftarkan Bagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
+ [Daftarkan Unggahan Multibagian](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html)

## Penggunaan API REST
<a name="UsingRESTAPImpUpload"></a>

Bagian berikut dalam *Referensi API Amazon Simple Storage Service* menjelaskan tentang API REST untuk unggahan multibagian. 
+ [Mulai Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Unggah Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Selesaikan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Hentikan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html)
+ [Daftarkan Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html)
+ [Daftarkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html)

## Menggunakan AWS SDKs (API tingkat tinggi)
<a name="multipart-upload-high-level"></a>

Beberapa AWS SDKs mengekspos API tingkat tinggi yang menyederhanakan pengunggahan multibagian dengan menggabungkan berbagai operasi API yang diperlukan untuk menyelesaikan unggahan multibagian ke dalam satu operasi. Untuk informasi selengkapnya, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md). 

Jika Anda perlu menjeda dan melanjutkan unggahan multipart, memvariasikan ukuran bagian selama pengunggahan, atau tidak mengetahui ukuran data sebelumnya, gunakan metode API tingkat rendah. Metode API tingkat rendah untuk unggahan multipart menawarkan fungsionalitas tambahan, untuk informasi selengkapnya, lihat. [Menggunakan AWS SDKs (API tingkat rendah)](#mpu-upload-low-level) 

------
#### [ Java ]

Untuk contoh cara melakukan upload multipart dengan AWS SDK for Java, [lihat Mengunggah atau mengunduh file besar ke dan dari Amazon S3 menggunakan AWS SDK di Referensi API *Amazon* S3](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_UsingLargeFiles_section.html).

------
#### [ .NET ]

Untuk mengunggah file ke bucket S3, gunakan kelas `TransferUtility`. Saat mengunggah data dari sebuah file, Anda harus menyediakan nama kunci objeknya. Jika tidak, API akan menggunakan nama file untuk nama kunci. Saat mengunggah data dari stream, Anda harus memberikan nama kunci objek.

Untuk mengatur opsi unggahan tingkat lanjut—seperti ukuran bagian, jumlah thread saat mengunggah beberapa bagian secara bersamaan, metadata, kelas penyimpanan, atau ACL—gunakan kelas `TransferUtilityUploadRequest`. 

**catatan**  
Saat Anda menggunakan stream untuk sumber data, kelas `TransferUtility` tidak mengunggah secara bersamaan. 

Contoh C\$1 berikut mengunggah file ke bucket Amazon S3 dalam beberapa bagian. Contoh ini menunjukkan cara menggunakan berbagai kelebihan muatan `TransferUtility.Upload` untuk mengunggah sebuah file. Setiap panggilan berurutan untuk unggahan menggantikan unggahan sebelumnya. Untuk informasi tentang menyiapkan dan menjalankan contoh kode, lihat [Memulai SDK for .NET di AWSAWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class UploadFileMPUHighLevelAPITest
    {
        private const string bucketName = "*** provide bucket name ***";
        private const string keyName = "*** provide a name for the uploaded object ***";
        private const string filePath = "*** provide the full path name of the file to upload ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            UploadFileAsync().Wait();
        }

        private static async Task UploadFileAsync()
        {
            try
            {
                var fileTransferUtility =
                    new TransferUtility(s3Client);

                // Option 1. Upload a file. The file name is used as the object key name.
                await fileTransferUtility.UploadAsync(filePath, bucketName);
                Console.WriteLine("Upload 1 completed");

                // Option 2. Specify object key name explicitly.
                await fileTransferUtility.UploadAsync(filePath, bucketName, keyName);
                Console.WriteLine("Upload 2 completed");

                // Option 3. Upload data from a type of System.IO.Stream.
                using (var fileToUpload = 
                    new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    await fileTransferUtility.UploadAsync(fileToUpload,
                                               bucketName, keyName);
                }
                Console.WriteLine("Upload 3 completed");

                // Option 4. Specify advanced settings.
                var fileTransferUtilityRequest = new TransferUtilityUploadRequest
                {
                    BucketName = bucketName,
                    FilePath = filePath,
                    StorageClass = S3StorageClass.StandardInfrequentAccess,
                    PartSize = 6291456, // 6 MB.
                    Key = keyName,
                    CannedACL = S3CannedACL.PublicRead
                };
                fileTransferUtilityRequest.Metadata.Add("param1", "Value1");
                fileTransferUtilityRequest.Metadata.Add("param2", "Value2");

                await fileTransferUtility.UploadAsync(fileTransferUtilityRequest);
                Console.WriteLine("Upload 4 completed");
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }

        }
    }
}
```

------
#### [ JavaScript ]

**Example**  
Unggah file besar.  

```
import { S3Client } from "@aws-sdk/client-s3";
import { Upload } from "@aws-sdk/lib-storage";

import {
  ProgressBar,
  logger,
} from "@aws-doc-sdk-examples/lib/utils/util-log.js";

const twentyFiveMB = 25 * 1024 * 1024;

export const createString = (size = twentyFiveMB) => {
  return "x".repeat(size);
};

/**
 * Create a 25MB file and upload it in parts to the specified
 * Amazon S3 bucket.
 * @param {{ bucketName: string, key: string }}
 */
export const main = async ({ bucketName, key }) => {
  const str = createString();
  const buffer = Buffer.from(str, "utf8");
  const progressBar = new ProgressBar({
    description: `Uploading "${key}" to "${bucketName}"`,
    barLength: 30,
  });

  try {
    const upload = new Upload({
      client: new S3Client({}),
      params: {
        Bucket: bucketName,
        Key: key,
        Body: buffer,
      },
    });

    upload.on("httpUploadProgress", ({ loaded, total }) => {
      progressBar.update({ current: loaded, total });
    });

    await upload.done();
  } catch (caught) {
    if (caught instanceof Error && caught.name === "AbortError") {
      logger.error(`Multipart upload was aborted. ${caught.message}`);
    } else {
      throw caught;
    }
  }
};
```

**Example**  
Unduh file besar.  

```
import { fileURLToPath } from "node:url";
import { GetObjectCommand, NoSuchKey, S3Client } from "@aws-sdk/client-s3";
import { createWriteStream, rmSync } from "node:fs";

const s3Client = new S3Client({});
const oneMB = 1024 * 1024;

export const getObjectRange = ({ bucket, key, start, end }) => {
  const command = new GetObjectCommand({
    Bucket: bucket,
    Key: key,
    Range: `bytes=${start}-${end}`,
  });

  return s3Client.send(command);
};

/**
 * @param {string | undefined} contentRange
 */
export const getRangeAndLength = (contentRange) => {
  const [range, length] = contentRange.split("/");
  const [start, end] = range.split("-");
  return {
    start: Number.parseInt(start),
    end: Number.parseInt(end),
    length: Number.parseInt(length),
  };
};

export const isComplete = ({ end, length }) => end === length - 1;

const downloadInChunks = async ({ bucket, key }) => {
  const writeStream = createWriteStream(
    fileURLToPath(new URL(`./${key}`, import.meta.url)),
  ).on("error", (err) => console.error(err));

  let rangeAndLength = { start: -1, end: -1, length: -1 };

  while (!isComplete(rangeAndLength)) {
    const { end } = rangeAndLength;
    const nextRange = { start: end + 1, end: end + oneMB };

    const { ContentRange, Body } = await getObjectRange({
      bucket,
      key,
      ...nextRange,
    });
    console.log(`Downloaded bytes ${nextRange.start} to ${nextRange.end}`);

    writeStream.write(await Body.transformToByteArray());
    rangeAndLength = getRangeAndLength(ContentRange);
  }
};

/**
 * Download a large object from and Amazon S3 bucket.
 *
 * When downloading a large file, you might want to break it down into
 * smaller pieces. Amazon S3 accepts a Range header to specify the start
 * and end of the byte range to be downloaded.
 *
 * @param {{ bucketName: string, key: string }}
 */
export const main = async ({ bucketName, key }) => {
  try {
    await downloadInChunks({
      bucket: bucketName,
      key: key,
    });
  } catch (caught) {
    if (caught instanceof NoSuchKey) {
      console.error(`Failed to download object. No such key "${key}".`);
      rmSync(key);
    }
  }
};
```

------
#### [ Go ]

Untuk informasi selengkapnya tentang contoh kode Go untuk unggahan multibagian, lihat [Mengunggah atau mengunduh file besar ke dan dari Amazon S3 menggunakan AWS](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_UsingLargeFiles_section.html) SDK.

**Example**  
Unggah objek besar dengan menggunakan pengelola unggahan untuk memecah data menjadi beberapa bagian dan mengunggahnya secara bersamaan.  

```
import (
	"bytes"
	"context"
	"errors"
	"fmt"
	"io"
	"log"
	"os"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/service/s3/types"
	"github.com/aws/smithy-go"
)

// BucketBasics encapsulates the Amazon Simple Storage Service (Amazon S3) actions
// used in the examples.
// It contains S3Client, an Amazon S3 service client that is used to perform bucket
// and object actions.
type BucketBasics struct {
	S3Client *s3.Client
}
```

```
// UploadLargeObject uses an upload manager to upload data to an object in a bucket.
// The upload manager breaks large data into parts and uploads the parts concurrently.
func (basics BucketBasics) UploadLargeObject(ctx context.Context, bucketName string, objectKey string, largeObject []byte) error {
	largeBuffer := bytes.NewReader(largeObject)
	var partMiBs int64 = 10
	uploader := manager.NewUploader(basics.S3Client, func(u *manager.Uploader) {
		u.PartSize = partMiBs * 1024 * 1024
	})
	_, err := uploader.Upload(ctx, &s3.PutObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectKey),
		Body:   largeBuffer,
	})
	if err != nil {
		var apiErr smithy.APIError
		if errors.As(err, &apiErr) && apiErr.ErrorCode() == "EntityTooLarge" {
			log.Printf("Error while uploading object to %s. The object is too large.\n"+
				"The maximum size for a multipart upload is 5TB.", bucketName)
		} else {
			log.Printf("Couldn't upload large object to %v:%v. Here's why: %v\n",
				bucketName, objectKey, err)
		}
	} else {
		err = s3.NewObjectExistsWaiter(basics.S3Client).Wait(
			ctx, &s3.HeadObjectInput{Bucket: aws.String(bucketName), Key: aws.String(objectKey)}, time.Minute)
		if err != nil {
			log.Printf("Failed attempt to wait for object %s to exist.\n", objectKey)
		}
	}

	return err
}
```

**Example**  
Unduh objek besar dengan menggunakan pengelola unduhan untuk mendapatkan data dalam beberapa bagian dan mengunduhnya secara bersamaan.  

```
// DownloadLargeObject uses a download manager to download an object from a bucket.
// The download manager gets the data in parts and writes them to a buffer until all of
// the data has been downloaded.
func (basics BucketBasics) DownloadLargeObject(ctx context.Context, bucketName string, objectKey string) ([]byte, error) {
	var partMiBs int64 = 10
	downloader := manager.NewDownloader(basics.S3Client, func(d *manager.Downloader) {
		d.PartSize = partMiBs * 1024 * 1024
	})
	buffer := manager.NewWriteAtBuffer([]byte{})
	_, err := downloader.Download(ctx, buffer, &s3.GetObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectKey),
	})
	if err != nil {
		log.Printf("Couldn't download large object from %v:%v. Here's why: %v\n",
			bucketName, objectKey, err)
	}
	return buffer.Bytes(), err
}
```

------
#### [ PHP ]

Topik ini menjelaskan cara menggunakan `Aws\S3\Model\MultipartUpload\UploadBuilder` kelas tingkat tinggi dari AWS SDK untuk PHP untuk upload file multipart. Untuk informasi selengkapnya tentang AWS SDK for Ruby API, [AWS buka SDK for Ruby](https://docs.aws.amazon.com/sdkforruby/api/index.html) - Versi 2.

Contoh PHP berikut mengunggah file ke bucket Amazon S3. Contoh ini menunjukkan cara menetukan parameter untuk objek `MultipartUploader`. 

```
 require 'vendor/autoload.php';

use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Prepare the upload parameters.
$uploader = new MultipartUploader($s3, '/path/to/large/file.zip', [
    'bucket' => $bucket,
    'key'    => $keyname
]);

// Perform the upload.
try {
    $result = $uploader->upload();
    echo "Upload complete: {$result['ObjectURL']}" . PHP_EOL;
} catch (MultipartUploadException $e) {
    echo $e->getMessage() . PHP_EOL;
}
```

------
#### [ Python ]

Contoh berikut memuat objek menggunakan API Python unggahan multibagian tingkat tinggi (kelas `TransferManager`). 

```
import sys
import threading

import boto3
from boto3.s3.transfer import TransferConfig


MB = 1024 * 1024
s3 = boto3.resource("s3")


class TransferCallback:
    """
    Handle callbacks from the transfer manager.

    The transfer manager periodically calls the __call__ method throughout
    the upload and download process so that it can take action, such as
    displaying progress to the user and collecting data about the transfer.
    """

    def __init__(self, target_size):
        self._target_size = target_size
        self._total_transferred = 0
        self._lock = threading.Lock()
        self.thread_info = {}

    def __call__(self, bytes_transferred):
        """
        The callback method that is called by the transfer manager.

        Display progress during file transfer and collect per-thread transfer
        data. This method can be called by multiple threads, so shared instance
        data is protected by a thread lock.
        """
        thread = threading.current_thread()
        with self._lock:
            self._total_transferred += bytes_transferred
            if thread.ident not in self.thread_info.keys():
                self.thread_info[thread.ident] = bytes_transferred
            else:
                self.thread_info[thread.ident] += bytes_transferred

            target = self._target_size * MB
            sys.stdout.write(
                f"\r{self._total_transferred} of {target} transferred "
                f"({(self._total_transferred / target) * 100:.2f}%)."
            )
            sys.stdout.flush()


def upload_with_default_configuration(
    local_file_path, bucket_name, object_key, file_size_mb
):
    """
    Upload a file from a local folder to an Amazon S3 bucket, using the default
    configuration.
    """
    transfer_callback = TransferCallback(file_size_mb)
    s3.Bucket(bucket_name).upload_file(
        local_file_path, object_key, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def upload_with_chunksize_and_meta(
    local_file_path, bucket_name, object_key, file_size_mb, metadata=None
):
    """
    Upload a file from a local folder to an Amazon S3 bucket, setting a
    multipart chunk size and adding metadata to the Amazon S3 object.

    The multipart chunk size controls the size of the chunks of data that are
    sent in the request. A smaller chunk size typically results in the transfer
    manager using more threads for the upload.

    The metadata is a set of key-value pairs that are stored with the object
    in Amazon S3.
    """
    transfer_callback = TransferCallback(file_size_mb)

    config = TransferConfig(multipart_chunksize=1 * MB)
    extra_args = {"Metadata": metadata} if metadata else None
    s3.Bucket(bucket_name).upload_file(
        local_file_path,
        object_key,
        Config=config,
        ExtraArgs=extra_args,
        Callback=transfer_callback,
    )
    return transfer_callback.thread_info


def upload_with_high_threshold(local_file_path, bucket_name, object_key, file_size_mb):
    """
    Upload a file from a local folder to an Amazon S3 bucket, setting a
    multipart threshold larger than the size of the file.

    Setting a multipart threshold larger than the size of the file results
    in the transfer manager sending the file as a standard upload instead of
    a multipart upload.
    """
    transfer_callback = TransferCallback(file_size_mb)
    config = TransferConfig(multipart_threshold=file_size_mb * 2 * MB)
    s3.Bucket(bucket_name).upload_file(
        local_file_path, object_key, Config=config, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def upload_with_sse(
    local_file_path, bucket_name, object_key, file_size_mb, sse_key=None
):
    """
    Upload a file from a local folder to an Amazon S3 bucket, adding server-side
    encryption with customer-provided encryption keys to the object.

    When this kind of encryption is specified, Amazon S3 encrypts the object
    at rest and allows downloads only when the expected encryption key is
    provided in the download request.
    """
    transfer_callback = TransferCallback(file_size_mb)
    if sse_key:
        extra_args = {"SSECustomerAlgorithm": "AES256", "SSECustomerKey": sse_key}
    else:
        extra_args = None
    s3.Bucket(bucket_name).upload_file(
        local_file_path, object_key, ExtraArgs=extra_args, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_default_configuration(
    bucket_name, object_key, download_file_path, file_size_mb
):
    """
    Download a file from an Amazon S3 bucket to a local folder, using the
    default configuration.
    """
    transfer_callback = TransferCallback(file_size_mb)
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_single_thread(
    bucket_name, object_key, download_file_path, file_size_mb
):
    """
    Download a file from an Amazon S3 bucket to a local folder, using a
    single thread.
    """
    transfer_callback = TransferCallback(file_size_mb)
    config = TransferConfig(use_threads=False)
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, Config=config, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_high_threshold(
    bucket_name, object_key, download_file_path, file_size_mb
):
    """
    Download a file from an Amazon S3 bucket to a local folder, setting a
    multipart threshold larger than the size of the file.

    Setting a multipart threshold larger than the size of the file results
    in the transfer manager sending the file as a standard download instead
    of a multipart download.
    """
    transfer_callback = TransferCallback(file_size_mb)
    config = TransferConfig(multipart_threshold=file_size_mb * 2 * MB)
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, Config=config, Callback=transfer_callback
    )
    return transfer_callback.thread_info


def download_with_sse(
    bucket_name, object_key, download_file_path, file_size_mb, sse_key
):
    """
    Download a file from an Amazon S3 bucket to a local folder, adding a
    customer-provided encryption key to the request.

    When this kind of encryption is specified, Amazon S3 encrypts the object
    at rest and allows downloads only when the expected encryption key is
    provided in the download request.
    """
    transfer_callback = TransferCallback(file_size_mb)

    if sse_key:
        extra_args = {"SSECustomerAlgorithm": "AES256", "SSECustomerKey": sse_key}
    else:
        extra_args = None
    s3.Bucket(bucket_name).Object(object_key).download_file(
        download_file_path, ExtraArgs=extra_args, Callback=transfer_callback
    )
    return transfer_callback.thread_info
```

------

## Menggunakan AWS SDKs (API tingkat rendah)
<a name="mpu-upload-low-level"></a>

 AWS SDK mengekspos API tingkat rendah yang sangat mirip dengan Amazon S3 REST API untuk unggahan multipart (lihat. [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md) Gunakan API tingkat rendah saat Anda perlu menjeda dan melanjutkan unggahan multibagian, memvariasikan ukuran bagian selama pengunggahan, atau tidak mengetahui ukuran data unggahan sebelumnya. Jika Anda tidak memiliki persyaratan ini, gunakan API tingkat tinggi (lihat[Menggunakan AWS SDKs (API tingkat tinggi)](#multipart-upload-high-level)).

------
#### [ Java ]

Contoh berikut menunjukkan cara menggunakan kelas Java tingkat rendah untuk mengunggah file. Ini melakukan langkah-langkah berikut:
+ Memulai unggahan multibagian menggunakan metode `AmazonS3Client.initiateMultipartUpload()`, dan melalui objek `InitiateMultipartUploadRequest`.
+ Menyimpan ID unggahan yang dikembalikan oleh metode `AmazonS3Client.initiateMultipartUpload()`. Anda dapat menyediakan ID unggahan untuk setiap operasi unggahan multibagian selanjutnya.
+ Mengunggah bagian objek. Untuk setiap bagian, Anda memanggil metode `AmazonS3Client.uploadPart()`. Anda memberikan bagian informasi unggahan menggunakan objek `UploadPartRequest`. 
+ Untuk setiap bagian, simpan ETag dari respons `AmazonS3Client.uploadPart()` metode dalam daftar. Anda dapat menggunakan nilai ETag untuk menyelesaikan unggahan multipart.
+ Memanggil metode `AmazonS3Client.completeMultipartUpload()` untuk menyelesaikan unggahan multibagian. 

**Example**  
Untuk petunjuk cara membuat dan menguji sampel yang berfungsi, lihat [Memulai](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) di Panduan AWS SDK untuk Java Pengembang.  

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class LowLevelMultipartUpload {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String keyName = "*** Key name ***";
        String filePath = "*** Path to file to upload ***";

        File file = new File(filePath);
        long contentLength = file.length();
        long partSize = 5 * 1024 * 1024; // Set part size to 5 MB.

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Create a list of ETag objects. You retrieve ETags for each object part
            // uploaded,
            // then, after each individual part has been uploaded, pass the list of ETags to
            // the request to complete the upload.
            List<PartETag> partETags = new ArrayList<PartETag>();

            // Initiate the multipart upload.
            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, keyName);
            InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest);

            // Upload the file parts.
            long filePosition = 0;
            for (int i = 1; filePosition < contentLength; i++) {
                // Because the last part could be less than 5 MB, adjust the part size as
                // needed.
                partSize = Math.min(partSize, (contentLength - filePosition));

                // Create the request to upload a part.
                UploadPartRequest uploadRequest = new UploadPartRequest()
                        .withBucketName(bucketName)
                        .withKey(keyName)
                        .withUploadId(initResponse.getUploadId())
                        .withPartNumber(i)
                        .withFileOffset(filePosition)
                        .withFile(file)
                        .withPartSize(partSize);

                // Upload the part and add the response's ETag to our list.
                UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest);
                partETags.add(uploadResult.getPartETag());

                filePosition += partSize;
            }

            // Complete the multipart upload.
            CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, keyName,
                    initResponse.getUploadId(), partETags);
            s3Client.completeMultipartUpload(compRequest);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

Contoh C\$1 berikut menunjukkan cara menggunakan API unggahan SDK untuk .NET multibagian tingkat rendah untuk mengunggah file ke bucket S3. Untuk informasi tentang unggahan multibagian Amazon S3, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md).

**catatan**  
Saat Anda menggunakan SDK untuk .NET API untuk mengunggah objek besar, batas waktu mungkin terjadi saat data sedang ditulis ke aliran permintaan. Anda dapat mengatur waktu habis yang eksplisit menggunakan `UploadPartRequest`. 

Contoh C\$1 berikut mengunggah file ke bucket S3 menggunakan API unggahan multibagian tingkat rendah. Untuk informasi tentang menyiapkan dan menjalankan contoh kode, lihat [Memulai SDK for .NET di AWSAWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*. 

```
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class UploadFileMPULowLevelAPITest
    {
        private const string bucketName = "*** provide bucket name ***";
        private const string keyName = "*** provide a name for the uploaded object ***";
        private const string filePath = "*** provide the full path name of the file to upload ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            Console.WriteLine("Uploading an object");
            UploadObjectAsync().Wait(); 
        }

        private static async Task UploadObjectAsync()
        {
            // Create list to store upload part responses.
            List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();

            // Setup information required to initiate the multipart upload.
            InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
            {
                BucketName = bucketName,
                Key = keyName
            };

            // Initiate the upload.
            InitiateMultipartUploadResponse initResponse =
                await s3Client.InitiateMultipartUploadAsync(initiateRequest);

            // Upload parts.
            long contentLength = new FileInfo(filePath).Length;
            long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB

            try
            {
                Console.WriteLine("Uploading parts");
        
                long filePosition = 0;
                for (int i = 1; filePosition < contentLength; i++)
                {
                    UploadPartRequest uploadRequest = new UploadPartRequest
                        {
                            BucketName = bucketName,
                            Key = keyName,
                            UploadId = initResponse.UploadId,
                            PartNumber = i,
                            PartSize = partSize,
                            FilePosition = filePosition,
                            FilePath = filePath
                        };

                    // Track upload progress.
                    uploadRequest.StreamTransferProgress +=
                        new EventHandler<StreamTransferProgressArgs>(UploadPartProgressEventCallback);

                    // Upload a part and add the response to our list.
                    uploadResponses.Add(await s3Client.UploadPartAsync(uploadRequest));

                    filePosition += partSize;
                }

                // Setup to complete the upload.
                CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
                    {
                        BucketName = bucketName,
                        Key = keyName,
                        UploadId = initResponse.UploadId
                     };
                completeRequest.AddPartETags(uploadResponses);

                // Complete the upload.
                CompleteMultipartUploadResponse completeUploadResponse =
                    await s3Client.CompleteMultipartUploadAsync(completeRequest);
            }
            catch (Exception exception)
            {
                Console.WriteLine("An AmazonS3Exception was thrown: { 0}", exception.Message);

                // Abort the upload.
                AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
                {
                    BucketName = bucketName,
                    Key = keyName,
                    UploadId = initResponse.UploadId
                };
               await s3Client.AbortMultipartUploadAsync(abortMPURequest);
            }
        }
        public static void UploadPartProgressEventCallback(object sender, StreamTransferProgressArgs e)
        {
            // Process event. 
            Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
        }
    }
}
```

------
#### [ PHP ]

Topik ini menunjukkan cara menggunakan `uploadPart` metode tingkat rendah dari versi 3 AWS SDK untuk PHP untuk mengunggah file di beberapa bagian. Untuk informasi selengkapnya tentang AWS SDK for Ruby API, [AWS buka SDK for Ruby](https://docs.aws.amazon.com/sdkforruby/api/index.html) - Versi 2.

Contoh PHP berikut mengunggah file ke bucket Amazon S3 menggunakan unggahan multipart PHP API tingkat rendah.

```
 require 'vendor/autoload.php';

use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$filename = '*** Path to and Name of the File to Upload ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

$result = $s3->createMultipartUpload([
    'Bucket'       => $bucket,
    'Key'          => $keyname,
    'StorageClass' => 'REDUCED_REDUNDANCY',
    'Metadata'     => [
        'param1' => 'value 1',
        'param2' => 'value 2',
        'param3' => 'value 3'
    ]
]);
$uploadId = $result['UploadId'];

// Upload the file in parts.
try {
    $file = fopen($filename, 'r');
    $partNumber = 1;
    while (!feof($file)) {
        $result = $s3->uploadPart([
            'Bucket'     => $bucket,
            'Key'        => $keyname,
            'UploadId'   => $uploadId,
            'PartNumber' => $partNumber,
            'Body'       => fread($file, 5 * 1024 * 1024),
        ]);
        $parts['Parts'][$partNumber] = [
            'PartNumber' => $partNumber,
            'ETag' => $result['ETag'],
        ];
        $partNumber++;

        echo "Uploading part $partNumber of $filename." . PHP_EOL;
    }
    fclose($file);
} catch (S3Exception $e) {
    $result = $s3->abortMultipartUpload([
        'Bucket'   => $bucket,
        'Key'      => $keyname,
        'UploadId' => $uploadId
    ]);

    echo "Upload of $filename failed." . PHP_EOL;
}

// Complete the multipart upload.
$result = $s3->completeMultipartUpload([
    'Bucket'   => $bucket,
    'Key'      => $keyname,
    'UploadId' => $uploadId,
    'MultipartUpload'    => $parts,
]);
$url = $result['Location'];

echo "Uploaded $filename to $url." . PHP_EOL;
```

------

## Menggunakan AWS SDK untuk Ruby
<a name="mpuoverview-ruby-sdk"></a>

 AWS SDK untuk Ruby Versi 3 mendukung unggahan multipart Amazon S3 dengan dua cara. Untuk opsi pertama, Anda dapat menggunakan unggahan file terkelola. Untuk informasi lebih lanjut, lihat [Mengunggah File ke Amazon S3](https://aws.amazon.com/blogs/developer/uploading-files-to-amazon-s3/) dalam *AWS Blog Pengembang*. Unggahan file terkelola adalah metode yang direkomendasikan untuk mengunggah file ke bucket. Mereka memberikan manfaat berikut:
+ Mengelola unggahan multibagian untuk objek yang lebih besar dari 15 MB.
+ Membuka file dengan benar dalam mode biner untuk menghindari masalah pengodean.
+ Menggunakan beberapa thread untuk mengunggah bagian-bagian objek besar secara paralel.

Alternatifnya, Anda dapat menggunakan operasi klien unggahan multibagian berikut secara langsung:
+ [create\$1multipart\$1upload](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#create_multipart_upload-instance_method)–Memulai sebuah unggahan multibagian dan menampilkan sebuah ID unggahan.
+ [upload\$1part](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#upload_part-instance_method)–Mengunggah satu bagian dalam sebuah unggahan multibagian.
+ [upload\$1part\$1copy](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#upload_part_copy-instance_method)–Mengunggah satu bagian dengan menyalin data dari objek yang ada sebagai sumber data.
+ [complete\$1multipart\$1upload](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#complete_multipart_upload-instance_method)–Menyelesaikan sebuah unggahan multibagian dengan merangkai bagian-bagian yang diunggah sebelumnya.
+ [abort\$1multipart\$1upload](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#abort_multipart_upload-instance_method)–Menghentikan unggahan multibagian.

# Mengunggah direktori menggunakan kelas .NET tingkat tinggi TransferUtility
<a name="HLuploadDirDotNet"></a>

Anda dapat menggunakan kelas `TransferUtility` untuk mengunggah sebuah direktori secara keseluruhan. Secara default, API hanya mengunggah file di dalam root direktori yang ditentukan. Namun, Anda dapat menentukan pengunggahan file secara rekursif di semua sub direktori. 

Untuk memilih file di direktori tertentu berdasarkan kriteria pemfilteran, tentukan ekspresi pemfilterannya. Misalnya, untuk mengunggah hanya `PDF` file dari direktori, tentukan ekspresi `"*.pdf"` filter. 

Saat mengunggah file dari sebuah direktori, Anda tidak perlu menentukan nama kunci untuk objek yang dihasilkan. Amazon S3 membangun nama kunci menggunakan jalur file asli. Misalnya, asumsikan bahwa Anda memiliki sebuah direktori yang disebut sebagai `c:\myfolder` dengan struktur berikut:

**Example**  

```
1. C:\myfolder
2.       \a.txt
3.       \b.pdf
4.       \media\               
5.              An.mp3
```

Saat Anda mengunggah direktori ini, Amazon S3 menggunakan nama kunci berikut:

**Example**  

```
1. a.txt
2. b.pdf
3. media/An.mp3
```

**Example**  
Contoh C\$1 berikut mengunggah sebuah direktori ke bucket Amazon S3. Contoh ini menunjukkan cara menggunakan berbagai kelebihan muatan `TransferUtility.UploadDirectory` untuk mengunggah direktori. Setiap panggilan berurutan untuk unggahan menggantikan unggahan sebelumnya. Untuk informasi tentang menyiapkan dan menjalankan contoh kode, lihat [Memulai SDK for .NET di AWSAWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*.   

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class UploadDirMPUHighLevelAPITest
    {
        private const string existingBucketName = "*** bucket name ***";
        private const string directoryPath = @"*** directory path ***";
        // The example uploads only .txt files.
        private const string wildCard = "*.txt";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;
        static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            UploadDirAsync().Wait();
        }

        private static async Task UploadDirAsync()
        {
            try
            {
                var directoryTransferUtility =
                    new TransferUtility(s3Client);

                // 1. Upload a directory.
                await directoryTransferUtility.UploadDirectoryAsync(directoryPath,
                    existingBucketName);
                Console.WriteLine("Upload statement 1 completed");

                // 2. Upload only the .txt files from a directory 
                //    and search recursively. 
                await directoryTransferUtility.UploadDirectoryAsync(
                                               directoryPath,
                                               existingBucketName,
                                               wildCard,
                                               SearchOption.AllDirectories);
                Console.WriteLine("Upload statement 2 completed");

                // 3. The same as Step 2 and some optional configuration. 
                //    Search recursively for .txt files to upload.
                var request = new TransferUtilityUploadDirectoryRequest
                {
                    BucketName = existingBucketName,
                    Directory = directoryPath,
                    SearchOption = SearchOption.AllDirectories,
                    SearchPattern = wildCard
                };

                await directoryTransferUtility.UploadDirectoryAsync(request);
                Console.WriteLine("Upload statement 3 completed");
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine(
                        "Error encountered ***. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine(
                    "Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

# Mendaftarkan unggahan multibagian
<a name="list-mpu"></a>

Anda dapat menggunakan AWS CLI, REST API, atau AWS SDKs, untuk mengambil daftar unggahan multipart yang sedang berlangsung di Amazon S3. Anda dapat menggunakan unggahan multibagian untuk mengunggah satu objek ke Amazon S3 secara terprogram. Unggahan multipart memindahkan objek ke Amazon S3 dengan memindahkan sebagian data objek sekaligus. Untuk informasi lebih umum tentang unggahan multipart, lihat. [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md) 

Untuk end-to-end prosedur mengunggah objek dengan unggahan multipart dengan checksum tambahan, lihat. [Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya](tutorial-s3-mpu-additional-checksums.md)

Bagian berikut menunjukkan cara membuat daftar unggahan multipart yang sedang berlangsung dengan AWS Command Line Interface, Amazon S3 REST API, dan. AWS SDKs

## Membuat daftar unggahan multipart menggunakan AWS CLI
<a name="list-mpu-cli"></a>

Bagian berikut dalam AWS Command Line Interface menjelaskan operasi untuk daftar unggahan multipart. 
+ [list-parts](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-parts.html)‐mendaftarkan bagian yang terunggah untuk unggahan multibagian tertentu.
+ [list-multipart-uploads](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-multipart-uploads.html)-daftar unggahan multipart yang sedang berlangsung.

# Mendaftarkan API REST untuk unggahan multibagian
<a name="list-mpu-rest"></a>

Bagian dalam *Referensi API Amazon Simple Storage Service* berikut ini menjelaskan tentang API REST untuk unggahan multibagian:
+ [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html)-daftar bagian yang diunggah untuk unggahan multibagian tertentu.
+ [ListMultipartUploads](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html)-daftar unggahan multipart yang sedang berlangsung.

## Mencantumkan unggahan multibagian menggunakan AWS SDK (API tingkat rendah)
<a name="list-aws-sdk"></a>

------
#### [ Java ]

Untuk mencantumkan semua unggahan multipart yang sedang berlangsung di bucket menggunakan SDK for AWS Java, Anda dapat menggunakan class API tingkat rendah untuk:


**Proses pendaftaran unggahan multibagian API tingkat rendah**  

|  |  | 
| --- |--- |
| 1 | Membuat sebuah instans dari kelas `ListMultipartUploadsRequest` dan memberikan nama bucket. | 
| 2 | Jalankan metode S3Client`listMultipartUploads`. Metode tersebut akan menampilkan sebuah instans dari kelas `ListMultipartUploadsResponse` yang menyediakan informasi tentang unggahan multibagian yang sedang berlangsung. | 

*Untuk contoh cara mencantumkan unggahan multibagian dengan AWS SDK for Java, lihat [Daftar unggahan multibagian di](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_ListMultipartUploads_section.html) Referensi API Amazon S3.*

------
#### [ .NET ]

Untuk mendaftarkan semua unggahan multibagian yang sedang berlangsung pada bucket tertentu, gunakan kelas SDK untuk .NET API unggahan multibagian tingkat rendah `ListMultipartUploadsRequest`. Metode `AmazonS3Client.ListMultipartUploads` akan mengembalikan instans dari kelas `ListMultipartUploadsResponse` yang memberikan informasi tentang unggahan multibagian yang sedang berlangsung. 

Unggahan multibagian yang sedang berlangsung adalah unggahan multibagian yang telah dimulai menggunakan permintaan unggahan multibagian, namun belum diselesaikan atau dihentikan. Untuk informasi selengkapnya tentang unggahan multipart Amazon S3, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md).

Contoh C\$1 berikut menunjukkan cara menggunakan daftar semua SDK untuk .NET unggahan multipart yang sedang berlangsung di bucket. Untuk informasi tentang menyiapkan dan menjalankan contoh kode, lihat [Memulai SDK for .NET di AWSAWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*. 

```
ListMultipartUploadsRequest request = new ListMultipartUploadsRequest
{
	 BucketName = bucketName // Bucket receiving the uploads.
};

ListMultipartUploadsResponse response = await AmazonS3Client.ListMultipartUploadsAsync(request);
```

------
#### [ PHP ]

Topik ini menunjukkan cara menggunakan class API tingkat rendah dari versi 3 AWS SDK untuk PHP untuk mencantumkan semua unggahan multibagian yang sedang berlangsung di bucket. Untuk informasi selengkapnya tentang AWS SDK for Ruby API, [AWS buka SDK for Ruby](https://docs.aws.amazon.com/sdkforruby/api/index.html) - Versi 2.

Contoh PHP berikut mendemonstrasikan pendaftaran semua unggahan multibagian yang sedang berlangsung pada sebuah bucket.

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Retrieve a list of the current multipart uploads.
$result = $s3->listMultipartUploads([
    'Bucket' => $bucket
]);

// Write the list of uploads to the page.
print_r($result->toArray());
```

------

# Melacak unggahan multipart dengan AWS SDKs
<a name="track-mpu"></a>

Anda dapat melacak kemajuan unggahan objek ke Amazon S3 dengan antarmuka mendengarkan. API unggahan multibagian tingkat tinggi menyediakan antarmuka mendengarkan seperti itu, yang disebut. `ProgressListener` Peristiwa progres secara berkala memberi tahu pendengar bahwa byte telah ditransfer. Untuk informasi lebih umum tentang unggahan multipart, lihat. [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md)

Untuk end-to-end prosedur mengunggah objek dengan unggahan multipart dengan checksum tambahan, lihat. [Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya](tutorial-s3-mpu-additional-checksums.md)

Bagian berikut menunjukkan cara melacak unggahan multipart dengan file. AWS SDKs

------
#### [ Java ]

**Example**  
Kode Java berikut mengunggah file dan menggunakan `ExecutionInterceptor` untuk melacak kemajuan unggahan. Untuk petunjuk tentang cara membuat dan menguji sampel yang berfungsi, lihat [Memulai](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html) di Panduan Pengembang AWS SDK untuk Java 2.x.   

```
import java.nio.file.Paths;

import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.core.interceptor.Context;
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;

public class TrackMPUProgressUsingHighLevelAPI {

    static class ProgressListener implements ExecutionInterceptor {
        private long transferredBytes = 0;

        @Override
        public void beforeTransmission(Context.BeforeTransmission context, ExecutionAttributes executionAttributes) {
            if (context.httpRequest().firstMatchingHeader("Content-Length").isPresent()) {
                String contentLength = context.httpRequest().firstMatchingHeader("Content-Length").get();
                long partSize = Long.parseLong(contentLength);
                transferredBytes += partSize;
                System.out.println("Transferred bytes: " + transferredBytes);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        String existingBucketName = "*** Provide bucket name ***";
        String keyName = "*** Provide object key ***";
        String filePath = "*** file to upload ***";

        S3AsyncClient s3Client = S3AsyncClient.builder()
                .credentialsProvider(ProfileCredentialsProvider.create())
                .overrideConfiguration(c -> c.addExecutionInterceptor(new ProgressListener()))
                .build();

        // For more advanced uploads, you can create a request object
        // and supply additional request parameters (ex: progress listeners,
        // canned ACLs, etc.)
        PutObjectRequest request = PutObjectRequest.builder()
                .bucket(existingBucketName)
                .key(keyName)
                .build();

        AsyncRequestBody requestBody = AsyncRequestBody.fromFile(Paths.get(filePath));

        // You can ask the upload for its progress, or you can
        // add a ProgressListener to your request to receive notifications
        // when bytes are transferred.
        // S3AsyncClient processes all transfers asynchronously,
        // so this call will return immediately.
        var upload = s3Client.putObject(request, requestBody);

        try {
            // You can block and wait for the upload to finish
            upload.join();
        } catch (Exception exception) {
            System.out.println("Unable to upload file, upload aborted.");
            exception.printStackTrace();
        } finally {
            s3Client.close();
        }
    }
}
```

------
#### [ .NET ]

Contoh C\$1 berikut ini menampilkan mengunggah sebuah file ke sebuah bucket S3 menggunakan kelas `TransferUtility`, dan melacak progres unggahan. Untuk informasi tentang menyiapkan dan menjalankan contoh kode, lihat [Memulai SDK for .NET di AWSAWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class TrackMPUUsingHighLevelAPITest
    {
        private const string bucketName = "*** provide the bucket name ***";
        private const string keyName = "*** provide the name for the uploaded object ***";
        private const string filePath = " *** provide the full path name of the file to upload **";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;


        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            TrackMPUAsync().Wait();
        }

        private static async Task TrackMPUAsync()
        {
            try
            {
                var fileTransferUtility = new TransferUtility(s3Client);

                // Use TransferUtilityUploadRequest to configure options.
                // In this example we subscribe to an event.
                var uploadRequest =
                    new TransferUtilityUploadRequest
                    {
                        BucketName = bucketName,
                        FilePath = filePath,
                        Key = keyName
                    };

                uploadRequest.UploadProgressEvent +=
                    new EventHandler<UploadProgressArgs>
                        (uploadRequest_UploadPartProgressEvent);

                await fileTransferUtility.UploadAsync(uploadRequest);
                Console.WriteLine("Upload completed");
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }

        static void uploadRequest_UploadPartProgressEvent(object sender, UploadProgressArgs e)
        {
            // Process event.
            Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
        }
    }
}
```

------

# Membatalkan unggahan multibagian
<a name="abort-mpu"></a>

Setelah memulai unggahan multibagian, Anda memulai pengunggahan bagian. Amazon S3 menyimpan bagian-bagian ini, dan hanya membuat objek setelah Anda mengunggah semua bagian dan mengirim permintaan untuk menyelesaikan unggahan multipart. Setelah menerima keseluruhan permintaan unggahan multibagian, Amazon S3 akan menyusun bagian-bagiannya, dan membuat sebuah objek. Jika Anda tidak berhasil mengirim permintaan unggahan multibagian lengkap, S3 tidak merakit komponen dan tidak membuat objek apa pun. Jika Anda ingin tidak menyelesaikan unggahan multipart setelah mengunggah bagian, Anda harus membatalkan unggahan multipart.

Anda akan ditagih untuk semua penyimpanan yang terkait dengan bagian yang diunggah. Disarankan untuk selalu menyelesaikan unggahan multibagian atau menghentikan unggahan multibagian untuk menghapus bagian yang diunggah. Untuk informasi lebih lanjut tentang harga, lihat[Unggahan multibagian dan harga](mpuoverview.md#mpuploadpricing).

Anda juga dapat menghentikan unggahan multibagian yang tidak lengkap menggunakan konfigurasi siklus hidup bucket. Untuk informasi selengkapnya, lihat [Mengonfigurasi siklus hidup bucket untuk menghapus unggahan multibagian yang tidak lengkap](mpu-abort-incomplete-mpu-lifecycle-config.md).

Bagian berikut menunjukkan cara menghentikan unggahan multipart yang sedang berlangsung di Amazon S3 menggunakan AWS Command Line Interface, REST API, atau. AWS SDKs

## Menggunakan AWS CLI
<a name="abort-mpu-cli"></a>

Untuk informasi selengkapnya tentang penggunaan AWS CLI untuk menghentikan unggahan multibagian, lihat [abort-multipart-upload](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/abort-multipart-upload.html)di *Referensi AWS CLI Perintah*.

## Penggunaan API REST
<a name="abort-mpu-rest"></a>

Untuk informasi selengkapnya tentang penggunaan REST API untuk menghentikan unggahan multibagian, lihat [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html)di *Referensi API Amazon Simple Storage Service*.

## Menggunakan AWS SDKs (API tingkat tinggi)
<a name="abort-mpu-high-level"></a>

------
#### [ Java ]

Untuk menghentikan unggahan multibagian yang sedang berlangsung menggunakan AWS SDK for Java, Anda dapat membatalkan unggahan yang dimulai sebelum tanggal yang ditentukan dan masih dalam proses. Pengunggahan dianggap sedang berlangsung setelah Anda memulainya, dan hingga Anda menyelesaikan atau menghentikannya.

Untuk menghentikan unggahan multipart, Anda dapat:


|  |  | 
| --- |--- |
| 1 | Buat instance S3Client. | 
| 2 | Gunakan metode abort klien dengan meneruskan nama bucket dan parameter lain yang diperlukan. | 

**catatan**  
Anda juga dapat menghentikan unggahan multibagian tertentu. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDKs (API tingkat rendah)](#abort-mpu-low-level).

*Untuk contoh cara membatalkan unggahan multipart dengan SDK for AWS Java, [lihat Membatalkan unggahan multibagian di Referensi](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_AbortMultipartUpload_section.html) API Amazon S3.*

------
#### [ .NET ]

Contoh C\$1 berikut menghentikan semua unggahan multibagian yang sedang berlangsung yang dimulai pada bucket tertentu lebih dari seminggu yang lalu. Untuk informasi tentang menyiapkan dan menjalankan contoh kode, lihat [Memulai SDK for .NET di AWSAWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Transfer;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class AbortMPUUsingHighLevelAPITest
    {
        private const string bucketName = "*** provide bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            AbortMPUAsync().Wait();
        }

        private static async Task AbortMPUAsync()
        {
            try
            {
                var transferUtility = new TransferUtility(s3Client);

                // Abort all in-progress uploads initiated before the specified date.
                await transferUtility.AbortMultipartUploadsAsync(
                    bucketName, DateTime.Now.AddDays(-7));
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        } 
    }
}
```

**catatan**  
Anda juga dapat menghentikan unggahan multibagian tertentu. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDKs (API tingkat rendah)](#abort-mpu-low-level). 

------

## Menggunakan AWS SDKs (API tingkat rendah)
<a name="abort-mpu-low-level"></a>

Anda dapat menghentikan unggahan multibagian yang sedang berlangsung dengan memanggil metode `AmazonS3.abortMultipartUpload`. Metode ini menghapus semua bagian yang diunggah pada Amazon S3, dan mengosongkan sumber daya. Anda harus menyediakan ID unggahan, nama bucket, dan nama kunci. Contoh kode Java berikut menunjukkan cara menghentikan sebuah unggahan multibagian yang sedang berlangsung.

Untuk menghentikan unggahan multibagian, Anda harus memberikan ID unggahan, dan bucket serta nama kunci yang digunakan dalam unggahan tersebut. Setelah Anda menghentikan unggahan multibagian, Anda tidak dapat menggunakan ID unggahan untuk mengunggah bagian tambahan. Untuk informasi selengkapnya tentang unggahan multibagian Amazon S3, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md).

------
#### [ Java ]

Untuk menghentikan unggahan multibagian tertentu yang sedang berlangsung menggunakan AWS SDK for Java, Anda dapat menggunakan API tingkat rendah untuk membatalkan unggahan dengan memberikan nama bucket, kunci objek, dan ID unggah.

**catatan**  
Alih-alih membatalkan unggahan multibagian tertentu, Anda dapat menghentikan semua unggahan multibagian yang dimulai sebelum waktu tertentu yang masih berlangsung. Operasi pembersihan ini berguna untuk menghentikan unggahan multibagian lama yang Anda mulai tetapi tidak diselesaikan atau dihentikan. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDKs (API tingkat tinggi)](#abort-mpu-high-level).

*Untuk contoh cara membatalkan unggahan multibagian tertentu dengan AWS SDK for Java, lihat [Membatalkan unggahan multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_AbortMultipartUpload_section.html) di Referensi API Amazon S3.*

------
#### [ .NET ]

Contoh C\$1 berikut menunjukkan cara untuk menghentikan unggahan multibagian. Untuk keseluruhan sampel C\$1 yang mencakup kode berikut, lihat [Menggunakan AWS SDKs (API tingkat rendah)](mpu-upload-object.md#mpu-upload-low-level).

```
AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
{
    BucketName = existingBucketName,
    Key = keyName,
    UploadId = initResponse.UploadId
};
await AmazonS3Client.AbortMultipartUploadAsync(abortMPURequest);
```

Anda juga dapat membatalkan semua unggahan multibagian yang sedang berlangsung, yang dimulai sebelum waktu tertentu. Operasi pembersihan ini berguna untuk membatalkan unggahan multibagian yang tidak selesai atau dibatalkan. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDKs (API tingkat tinggi)](#abort-mpu-high-level).

------
#### [ PHP ]

Contoh ini menunjukkan cara menggunakan kelas dari versi 3 AWS SDK untuk PHP untuk membatalkan unggahan multibagian yang sedang berlangsung. Untuk informasi selengkapnya tentang AWS SDK for Ruby API, [AWS buka SDK for Ruby](https://docs.aws.amazon.com/sdkforruby/api/index.html) - Versi 2. Contoh metode `abortMultipartUpload()`. 

Untuk informasi selengkapnya tentang AWS SDK for Ruby API, [AWS buka SDK for Ruby](https://docs.aws.amazon.com/sdkforruby/api/index.html) - Versi 2.

```
 require 'vendor/autoload.php';

use Aws\S3\S3Client;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$uploadId = '*** Upload ID of upload to Abort ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// Abort the multipart upload.
$s3->abortMultipartUpload([
    'Bucket'   => $bucket,
    'Key'      => $keyname,
    'UploadId' => $uploadId,
]);
```

------

# Menyalin objek menggunakan unggahan multibagian
<a name="CopyingObjectsMPUapi"></a>

Unggahan multipart memungkinkan Anda menyalin objek sebagai satu set bagian. Contoh dalam bagian ini menunjukkan cara menyalin objek yang lebih besar dari 5 GB menggunakan API unggahan multibagian. Untuk informasi tentang unggahan multibagian, lihat. [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md)

Anda dapat menyalin objek kurang dari 5 GB dalam satu operasi tanpa menggunakan API unggahan multibagian. Anda dapat menyalin objek kurang dari 5 GB menggunakan Konsol Manajemen AWS, AWS CLI, REST API, atau AWS SDKs. Untuk informasi selengkapnya, lihat [Menyalin, memindahkan, dan mengganti nama objek](copy-object.md). 

Untuk end-to-end prosedur mengunggah objek dengan unggahan multipart dengan checksum tambahan, lihat. [Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya](tutorial-s3-mpu-additional-checksums.md)

Bagian berikut menunjukkan cara menyalin objek dengan unggahan multipart dengan REST API atau AWS SDKs.

## Penggunaan API REST
<a name="CopyingObjctsUsingRESTMPUapi"></a>

Bagian berikut dalam *Referensi API Amazon Simple Storage Service* menjelaskan tentang API REST untuk unggahan multibagian. Untuk menyalin objek yang sudah ada, Anda dapat menggunakan API Unggah Bagian (Salinan), dan menentukan objek sumber dengan menambahkan header permintaan `x-amz-copy-source` dalam permintaan Anda. 
+ [Mulai Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html)
+ [Unggah Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPart.html)
+ [Unggah Bagian (Salinan)](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)
+ [Selesaikan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html)
+ [Batalkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html)
+ [Daftarkan Bagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html)
+ [Daftarkan Unggahan Multibagian](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListMPUpload.html)

Anda dapat menggunakan ini APIs untuk membuat permintaan REST Anda sendiri, atau Anda dapat menggunakan salah satu dari yang SDKs kami sediakan. Untuk informasi selengkapnya tentang menggunakan Unggahan Multipart dengan AWS CLI, lihat[Menggunakan AWS CLI](mpu-upload-object.md#UsingCLImpUpload). Untuk informasi lebih lanjut tentang SDKs, lihat[AWS Dukungan SDK untuk unggahan multipart](mpuoverview.md#sdksupportformpu).

## Menggunakan AWS SDKs
<a name="copy-object-mpu-sdks"></a>

Untuk menyalin sebuah objek menggunakan API tingkat rendah, lakukan hal berikut ini:
+ Mulai unggahan multibagian dengan memanggil metode `AmazonS3Client.initiateMultipartUpload()`.
+ Simpan ID unggahan dari objek respons yang dikembalikan oleh metode `AmazonS3Client.initiateMultipartUpload()`. Anda memberikan ID unggahan ini untuk setiap operasi unggahan bagian.
+ Salin semua bagiannya. Untuk setiap bagian yang harus Anda salin, buat sebuah instans baru dari kelas `CopyPartRequest`. Berikan informasi bagian, termasuk nama bucket sumber dan tujuan, kunci objek sumber dan tujuan, ID unggahan, lokasi byte pertama dan terakhir bagian tersebut, dan nomor bagian. 
+ Simpan respons dari panggilan metode `AmazonS3Client.copyPart()`. Setiap respons mencakup nilai `ETag` dan nomor bagian untuk bagian yang diunggah. Anda memerlukan informasi ini untuk menyelesaikan unggahan multibagian. 
+ Perintahkan metode `AmazonS3Client.completeMultipartUpload()` untuk menyelesaikan operasi penyalinan. 

------
#### [ Java ]

Untuk contoh cara menyalin objek menggunakan unggahan multipart dengan AWS SDK for Java, [lihat Menyalin bagian objek dari objek lain](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_UploadPartCopy_section.html) di Referensi API *Amazon S3*.

------
#### [ .NET ]

Contoh C \$1 berikut menunjukkan cara menggunakan SDK untuk .NET untuk menyalin objek Amazon S3 yang lebih besar dari 5 GB dari satu lokasi sumber ke lokasi lain, seperti dari satu bucket ke bucket lainnya. Untuk menyalin objek yang lebih kecil dari 5 GB, gunakan prosedur penyalinan operasi tunggal yang dijelaskan dalam [Menggunakan AWS SDKs](copy-object.md#CopyingObjectsUsingSDKs). Untuk informasi selengkapnya tentang unggahan multibagian Amazon S3, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md).

Contoh ini menunjukkan cara menyalin objek Amazon S3 yang lebih besar dari 5 GB dari satu bucket S3 ke bucket lainnya menggunakan API unggahan SDK untuk .NET multipart.

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class CopyObjectUsingMPUapiTest
    {
        private const string sourceBucket = "*** provide the name of the bucket with source object ***";
        private const string targetBucket = "*** provide the name of the bucket to copy the object to ***";
        private const string sourceObjectKey = "*** provide the name of object to copy ***";
        private const string targetObjectKey = "*** provide the name of the object copy ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; 
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            Console.WriteLine("Copying an object");
            MPUCopyObjectAsync().Wait();
        }
        private static async Task MPUCopyObjectAsync()
        {
            // Create a list to store the upload part responses.
            List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
            List<CopyPartResponse> copyResponses = new List<CopyPartResponse>();

            // Setup information required to initiate the multipart upload.
            InitiateMultipartUploadRequest initiateRequest =
                new InitiateMultipartUploadRequest
                {
                    BucketName = targetBucket,
                    Key = targetObjectKey
                };

            // Initiate the upload.
            InitiateMultipartUploadResponse initResponse =
                await s3Client.InitiateMultipartUploadAsync(initiateRequest);

            // Save the upload ID.
            String uploadId = initResponse.UploadId;

            try
            {
                // Get the size of the object.
                GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
                {
                    BucketName = sourceBucket,
                    Key = sourceObjectKey
                };

                GetObjectMetadataResponse metadataResponse =
                    await s3Client.GetObjectMetadataAsync(metadataRequest);
                long objectSize = metadataResponse.ContentLength; // Length in bytes.

                // Copy the parts.
                long partSize = 5 * (long)Math.Pow(2, 20); // Part size is 5 MB.

                long bytePosition = 0;
                for (int i = 1; bytePosition < objectSize; i++)
                {
                    CopyPartRequest copyRequest = new CopyPartRequest
                    {
                        DestinationBucket = targetBucket,
                        DestinationKey = targetObjectKey,
                        SourceBucket = sourceBucket,
                        SourceKey = sourceObjectKey,
                        UploadId = uploadId,
                        FirstByte = bytePosition,
                        LastByte = bytePosition + partSize - 1 >= objectSize ? objectSize - 1 : bytePosition + partSize - 1,
                        PartNumber = i
                    };

                    copyResponses.Add(await s3Client.CopyPartAsync(copyRequest));

                    bytePosition += partSize;
                }

                // Set up to complete the copy.
                CompleteMultipartUploadRequest completeRequest =
                new CompleteMultipartUploadRequest
                {
                    BucketName = targetBucket,
                    Key = targetObjectKey,
                    UploadId = initResponse.UploadId
                };
                completeRequest.AddPartETags(copyResponses);

                // Complete the copy.
                CompleteMultipartUploadResponse completeUploadResponse = 
                    await s3Client.CompleteMultipartUploadAsync(completeRequest);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

# Tutorial: Unggah objek melalui unggahan multipart dan verifikasi integritas datanya
<a name="tutorial-s3-mpu-additional-checksums"></a>

 Unggahan multibagian memungkinkan Anda untuk mengunggah satu objek sebagai kumpulan bagian. Setiap bagian merupakan bagian data objek yang saling berkaitan. Anda dapat mengunggah bagian-bagian objek tersebut secara independen dan dengan urutan apa pun. Jika ada transmisi bagian mana pun yang gagal, Anda dapat mentransmisikan ulang bagian tersebut tanpa memengaruhi bagian lainnya. Setelah semua bagian objek Anda diunggah, Amazon S3 merakit bagian-bagian ini dan menciptakan objek. Secara umum, saat ukuran objek Anda mencapai 100 MB, Anda harus mempertimbangkan untuk menggunakan unggahan multibagian daripada mengunggah objek tersebut dalam satu operasi. Untuk informasi lebih lanjut tentang unggahan multibagian, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md). Untuk batasan yang terkait dengan unggahan multipart, lihat. [Batas unggahan multibagian Amazon S3](qfacts.md)

 Anda dapat menggunakan checksum untuk memverifikasi bahwa aset tidak diubah saat disalin. Melakukan checksum terdiri dari menggunakan algoritma untuk iterasi secara berurutan atas setiap byte dalam file. Amazon S3 menawarkan beberapa opsi checksum untuk memeriksa integritas data. Kami menyarankan Anda melakukan pemeriksaan integritas ini sebagai praktik terbaik daya tahan dan untuk mengonfirmasi bahwa setiap byte ditransfer tanpa perubahan. Amazon S3 juga mendukung algoritma berikut: SHA-1, SHA-256, dan C. CRC32 CRC32 Amazon S3 menggunakan satu atau lebih algoritme ini untuk menghitung nilai checksum tambahan dan menyimpannya sebagai bagian dari metadata objek. Untuk informasi selengkapnya tentang checksum, lihat [Memeriksa integritas objek di Amazon S3](checking-object-integrity.md).

**Tujuan**  
 Dalam tutorial ini, Anda akan belajar cara mengunggah objek ke Amazon S3 dengan menggunakan unggahan multipart dan checksum SHA-256 tambahan melalui Command AWS Line Interface (CLI).AWS Anda juga akan belajar cara memeriksa integritas data objek dengan menghitung MD5 hash dan checksum SHA-256 dari objek yang diunggah. 

**Topics**
+ [

## Prasyarat
](#mpu-prerequisites)
+ [

## Langkah 1: Buat file besar
](#create-large-file-step1)
+ [

## Langkah 2: Pisahkan file menjadi beberapa file
](#split-large-file-step2)
+ [

## Langkah 3: Buat unggahan multipart dengan checksum tambahan
](#create-multipart-upload-step3)
+ [

## Langkah 4: Unggah bagian dari unggahan multipart Anda
](#upload-parts-step4)
+ [

## Langkah 5: Buat daftar semua bagian dari unggahan multipart Anda
](#list-parts-step5)
+ [

## Langkah 6: Selesaikan unggahan multipart
](#complete-multipart-upload-step6)
+ [

## Langkah 7: Konfirmasikan bahwa objek diunggah ke bucket Anda
](#confirm-upload-step7)
+ [

## Langkah 8: Verifikasi integritas objek dengan MD5 checksum
](#verify-object-integrity-step8)
+ [

## Langkah 9: Verifikasi integritas objek dengan checksum tambahan
](#verify-object-integrity-sha256-step9)
+ [

## Langkah 10: Bersihkan sumber daya Anda
](#clean-up-step10)

## Prasyarat
<a name="mpu-prerequisites"></a>
+ Sebelum Anda memulai tutorial ini, pastikan Anda memiliki akses ke bucket Amazon S3 yang dapat Anda unggah. Untuk informasi selengkapnya, lihat [Membuat bucket tujuan umum](create-bucket-overview.md).
+  Anda harus menginstal dan AWS mengkonfigurasi CLI. Jika AWS CLI belum diinstal, lihat [Menginstal atau memperbarui ke versi terbaru dari AWS CLIAWS Command Line Interface](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html) *Panduan Pengguna*.
+ Atau, Anda dapat menjalankan perintah AWS CLI dari konsol dengan menggunakan. AWS CloudShell AWS CloudShell adalah shell pra-otentikasi berbasis browser yang dapat Anda luncurkan langsung dari file. Konsol Manajemen AWS Untuk informasi lebih lanjut, lihat [Apa itu CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) dan [Memulai dengan AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html) di *Panduan AWS CloudShell Pengguna*.

## Langkah 1: Buat file besar
<a name="create-large-file-step1"></a>

Jika Anda sudah memiliki file yang siap diunggah, Anda dapat menggunakan file untuk tutorial ini. Jika tidak, buat file 15 MB menggunakan langkah-langkah berikut. Untuk batasan yang terkait dengan unggahan multipart, lihat. [Batas unggahan multibagian Amazon S3](qfacts.md)

**Untuk membuat file besar**

Gunakan salah satu perintah berikut untuk membuat file Anda, tergantung pada sistem operasi yang Anda gunakan.

**Linux atau macOS**  
Untuk membuat file 15 MB, buka terminal lokal Anda dan jalankan perintah berikut:

```
dd if=/dev/urandom of=census-data.bin bs=1M count=15
```

Perintah ini membuat file bernama `census-data.bin` diisi dengan byte acak, dengan ukuran 15 MB.

**Windows**  
Untuk membuat file 15 MB, buka terminal lokal Anda dan jalankan perintah berikut:

```
fsutil file createnew census-data.bin 15728640
```

Perintah ini membuat file bernama `census-data.bin` dengan ukuran 15 MB data arbitrer (15728640 byte).

## Langkah 2: Pisahkan file menjadi beberapa file
<a name="split-large-file-step2"></a>

Untuk melakukan pengunggahan multipart, Anda harus membagi file besar Anda menjadi bagian-bagian yang lebih kecil. Anda kemudian dapat mengunggah bagian-bagian yang lebih kecil dengan menggunakan proses upload multipart. Langkah ini menunjukkan cara membagi file besar yang dibuat di [Langkah 1](#create-large-file-step1) menjadi bagian-bagian yang lebih kecil. Contoh berikut menggunakan file 15 MB bernama`census-data.bin`.

**Untuk membagi file besar menjadi beberapa bagian**

**Linux atau macOS**  
Untuk membagi file besar menjadi bagian 5 MB, gunakan `split` perintah. Buka terminal Anda dan jalankan yang berikut ini:

```
split -b 5M -d census-data.bin census-part
```

Perintah ini dibagi `census-data.bin` menjadi 5 MB bagian bernama`census-part**`, di mana `**` sufiks numerik dimulai dari. `00`

**Windows**  
Untuk membagi file besar, gunakan PowerShell. Buka [Powershell](https://learn.microsoft.com/en-us/powershell/), dan jalankan skrip berikut:

```
$inputFile = "census-data.bin"
$outputFilePrefix = "census-part"
$chunkSize = 5MB

$fs = [System.IO.File]::OpenRead($inputFile)
$buffer = New-Object byte[] $chunkSize
$fileNumber = 0

while ($fs.Position -lt $fs.Length) {
$bytesRead = $fs.Read($buffer, 0, $chunkSize)
$outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber
$fileStream = [System.IO.File]::Create($outputFile)
$fileStream.Write($buffer, 0, $bytesRead)
$fileStream.Close()
$fileNumber++
}

$fs.Close()
```

 PowerShell Script ini membaca file besar dalam potongan 5 MB dan menulis setiap potongan ke file baru dengan akhiran numerik.

Setelah menjalankan perintah yang sesuai, Anda akan melihat bagian-bagian di direktori tempat Anda menjalankan perintah. Setiap bagian akan memiliki akhiran yang sesuai dengan nomor bagiannya, misalnya:

```
census-part00 census-part01 census-part02
```

## Langkah 3: Buat unggahan multipart dengan checksum tambahan
<a name="create-multipart-upload-step3"></a>

Untuk memulai proses upload multipart, Anda perlu membuat permintaan upload multipart. Langkah ini melibatkan memulai unggahan multibagian dan menentukan checksum tambahan untuk integritas data. Contoh berikut menggunakan checksum SHA-256. Jika Anda ingin memberikan metadata apa pun yang menjelaskan objek yang sedang diunggah, Anda harus menyediakannya dalam permintaan untuk memulai unggahan multibagian.

**catatan**  
Pada langkah ini dan langkah selanjutnya, tutorial ini menggunakan algoritma tambahan SHA-256. Anda mungkin secara opsional menggunakan checksum tambahan lain untuk langkah-langkah ini, seperti, CRC32 C CRC32, atau SHA-1. Jika Anda menggunakan algoritma yang berbeda, Anda harus menggunakannya di seluruh langkah-langkah tutorial.

**Untuk memulai unggahan multipart**

Di terminal Anda, gunakan `create-multipart-upload` perintah berikut untuk memulai unggahan multipart untuk bucket Anda. Ganti `amzn-s3-demo-bucket1` dengan nama bucket Anda yang sebenarnya. Juga, ganti `census_data_file` dengan nama file yang Anda pilih. Nama file ini menjadi kunci objek saat unggahan selesai.

```
aws s3api create-multipart-upload --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --checksum-algorithm sha256
```

Jika permintaan Anda berhasil, Anda akan melihat output JSON seperti berikut:

```
{
    "ServerSideEncryption": "AES256",
    "ChecksumAlgorithm": "SHA256",
    "Bucket": "amzn-s3-demo-bucket1",
    "Key": "census_data_file",
    "UploadId": "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz"
}
```

**catatan**  
Saat Anda mengirim permintaan untuk memulai unggahan multibagian, Amazon S3 mengirimkan respons dengan ID unggahan, yang merupakan pengidentifikasi unik untuk unggahan multibagian Anda. Anda harus menyertakan ID unggahan ini setiap kali Anda mengunggah bagian, mendaftar bagian, menyelesaikan unggahan, atau menghentikan sebuah unggahan. Anda harus menggunakan `Bucket` nilai`UploadId`,`Key`, dan untuk langkah-langkah selanjutnya, jadi pastikan untuk menyimpannya.  
Selain itu, jika Anda menggunakan unggahan multibagian dengan checksum tambahan, nomor bagian harus berurutan. Jika Anda menggunakan nomor bagian yang tidak berurutan, `complete-multipart-upload` permintaan dapat menghasilkan HTTP. `500 Internal Server Error`

## Langkah 4: Unggah bagian dari unggahan multipart Anda
<a name="upload-parts-step4"></a>

Pada langkah ini, Anda akan mengunggah bagian dari unggahan multipart Anda ke bucket S3 Anda. Gunakan `upload-part` perintah untuk mengunggah setiap bagian satu per satu. Proses ini memerlukan penentuan ID unggahan, nomor bagian, dan file yang akan diunggah untuk setiap bagian.

**Untuk mengunggah bagian-bagiannya**

1. Saat mengunggah bagian, selain ID unggahan, Anda harus menentukan nomor bagian dengan menggunakan `--part-number` argumen. Anda dapat memilih nomor bagian antara 1 hingga 10.000. Nomor bagian secara unik mengidentifikasi sebuah bagian dan posisinya dalam objek yang Anda unggah. Nomor bagian yang Anda pilih harus dalam urutan berurutan (misalnya, bisa 1, 2, atau 3). Jika Anda mengunggah sebuah bagian baru menggunakan nomor yang sama dengan bagian yang diunggah sebelumnya, bagian yang diunggah sebelumnya akan ditimpa.

1. Gunakan `upload-part` perintah untuk mengunggah setiap bagian dari unggahan multipart Anda. Sama seperti pada output yang dibuat oleh `create-multipart-upload` perintah di [Langkah 3](#create-multipart-upload-step3). `--upload-id` Untuk mengunggah bagian pertama data Anda, gunakan perintah berikut:

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 1 --body census-part00 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256
   ```

   Setelah menyelesaikan setiap `upload-part` perintah, Anda akan melihat output seperti contoh berikut:

   ```
   {
       "ServerSideEncryption": "AES256",
       "ETag": "\"e611693805e812ef37f96c9937605e69\"",
       "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0="
   }
   ```

1. Untuk bagian selanjutnya, tambahkan nomor bagian yang sesuai:

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number <part-number> --body <file-path> --upload-id "<your-upload-id>" --checksum-algorithm SHA256
   ```

   Misalnya, gunakan perintah berikut untuk mengunggah bagian kedua:

   ```
   aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 2 --body census-part01 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256
   ```

   Amazon S3 mengembalikan tag entitas (ETag) dan checksum tambahan untuk setiap bagian yang diunggah sebagai header dalam respons.

1. Lanjutkan menggunakan `upload-part` perintah sampai Anda mengunggah semua bagian objek Anda.

## Langkah 5: Buat daftar semua bagian dari unggahan multipart Anda
<a name="list-parts-step5"></a>

Untuk menyelesaikan unggahan multibagian, Anda memerlukan daftar semua bagian yang telah diunggah untuk unggahan multibagian tertentu. Output dari `list-parts` perintah memberikan informasi seperti nama bucket, kunci, ID unggah, nomor bagian, checksum tambahan ETag, dan banyak lagi. Sangat membantu untuk menyimpan output ini dalam file sehingga Anda dapat menggunakannya untuk langkah berikutnya saat menyelesaikan proses pengunggahan multibagian. Anda dapat membuat file output JSON dipanggil `parts.json` dengan menggunakan metode berikut.

**Untuk membuat file yang mencantumkan semua bagian**

1. Untuk menghasilkan file JSON dengan rincian semua bagian yang diunggah, gunakan perintah berikut`list-parts`. Ganti ***amzn-s3-demo-bucket1*** dengan nama bucket Anda yang sebenarnya dan **<your-upload-id>** dengan ID unggahan yang Anda terima di [Langkah 3](#create-multipart-upload-step3). Untuk informasi selengkapnya tentang `list-parts` perintah, lihat [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)di *Panduan AWS Command Line Interface Pengguna*.

   ```
   aws s3api list-parts --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id> --query '{Parts: Parts[*].{PartNumber: PartNumber, ETag: ETag, ChecksumSHA256: ChecksumSHA256}}' --output json > parts.json
   ```

   Sebuah file baru bernama `parts.json` dihasilkan. File tersebut berisi informasi berformat JSON untuk semua bagian yang Anda unggah. `parts.json`File tersebut menyertakan informasi penting untuk setiap bagian dari unggahan multibagian Anda, seperti nomor bagian dan ETag nilai yang sesuai, yang diperlukan untuk menyelesaikan proses pengunggahan multibagian.

1. Buka `parts.json` dengan menggunakan editor teks apa pun atau melalui terminal. Berikut contoh outputnya:

   ```
   {
       "Parts": [
           {
               "PartNumber": 1,
               "ETag": "\"3c3097f89e2a2fece47ac54b243c9d97\"",
               "ChecksumSHA256": "fTPVHfyNHdv5VkR4S3EewdyioXECv7JBxN+d4FXYYTw="
           },
           {
               "PartNumber": 2,
               "ETag": "\"03c71cc160261b20ab74f6d2c476b450\"",
               "ChecksumSHA256": "VDWTa8enjOvULBAO3W2a6C+5/7ZnNjrnLApa1QVc3FE="
           },
           {
               "PartNumber": 3,
               "ETag": "\"81ae0937404429a97967dffa7eb4affb\"",
               "ChecksumSHA256": "cVVkXehUlzcwrBrXgPIM+EKQXPUvWist8mlUTCs4bg8="
           }
       ]
   }
   ```

## Langkah 6: Selesaikan unggahan multipart
<a name="complete-multipart-upload-step6"></a>

Setelah mengunggah semua bagian dari unggahan multipart Anda dan mencantumkannya, langkah terakhir adalah menyelesaikan unggahan multipart. Langkah ini menggabungkan semua bagian yang diunggah menjadi satu objek di bucket S3 Anda.

**catatan**  
Anda dapat menghitung checksum objek sebelum menelepon `complete-multipart-upload` dengan memasukkan `--checksum-sha256` permintaan Anda. Jika checksum tidak cocok, Amazon S3 gagal permintaan. Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html) di *AWS Command Line Interface Panduan Pengguna*.

**Untuk menyelesaikan unggahan multipart**

Untuk menyelesaikan unggahan multipart, gunakan perintah. `complete-multipart-upload` Perintah ini memerlukan `parts.json` file yang dibuat di [Langkah 5](#list-parts-step5), nama bucket Anda, dan ID unggahan. Ganti **<*amzn-s3-demo-bucket1*>** dengan nama bucket Anda dan **<your-upload-id>** dengan ID unggah dari`parts.json`.

```
aws s3api complete-multipart-upload --multipart-upload file://parts.json --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id>
```

Berikut contoh outputnya:

```
{
    "ServerSideEncryption": "AES256",
    "Location": "https://amzn-s3-demo-bucket1.s3.us-east-2.amazonaws.com/census_data_file",
    "Bucket": "amzn-s3-demo-bucket1",
    "Key": "census_data_file",
    "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"",
    "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3"
}
```

**catatan**  
Jangan menghapus file bagian individual. Anda akan memerlukan bagian-bagian individual sehingga Anda dapat melakukan checksum pada mereka untuk memverifikasi integritas objek yang digabungkan bersama.

## Langkah 7: Konfirmasikan bahwa objek diunggah ke bucket Anda
<a name="confirm-upload-step7"></a>

Setelah menyelesaikan unggahan multipart, Anda dapat memverifikasi bahwa objek telah berhasil diunggah ke bucket S3 Anda. Untuk membuat daftar objek di bucket Anda dan mengonfirmasi keberadaan file yang baru diunggah, gunakan perintah `list-objects-v2` 

**Untuk daftar objek yang diunggah**

Untuk membuat daftar objek di Anda, gunakan bucket `list-objects-v2` perintah. Ganti ***amzn-s3-demo-bucket1*** dengan nama bucket Anda yang sebenarnya: 

```
aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket1
```

Perintah ini mengembalikan daftar objek di bucket Anda. Cari file yang Anda unggah (misalnya,`census_data_file`) dalam daftar objek. 

Untuk informasi selengkapnya, lihat bagian [Contoh](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html) untuk `list-objects-v2` perintah di *Panduan AWS Command Line Interface Pengguna*.

## Langkah 8: Verifikasi integritas objek dengan MD5 checksum
<a name="verify-object-integrity-step8"></a>

Saat mengunggah objek, Anda dapat menentukan algoritma checksum untuk Amazon S3 untuk digunakan. Secara default, Amazon S3 menyimpan MD5 intisari byte sebagai objek. ETag Untuk unggahan multipart, ETag ini bukan checksum untuk seluruh objek, melainkan gabungan checksum untuk setiap bagian individu.

**Untuk memverifikasi integritas objek dengan menggunakan MD5 checksum**

1. Untuk mengambil objek ETag yang diunggah, lakukan permintaan: `head-object`

   ```
   aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file
   ```

   Berikut contoh outputnya:

   ```
   {
       "AcceptRanges": "bytes",
       "LastModified": "2024-07-26T19:04:13+00:00",
       "ContentLength": 16106127360,
       "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"",
       "ContentType": "binary/octet-stream",
       "ServerSideEncryption": "AES256",
       "Metadata": {}
   }
   ```

   Ini ETag memiliki “-3" ditambahkan ke akhir. Ini menunjukkan bahwa objek diunggah dalam tiga bagian menggunakan unggahan multipart.

1. Selanjutnya, hitung MD5 checksum setiap bagian menggunakan `md5sum` perintah. Pastikan Anda memberikan jalur yang benar ke file bagian Anda:

   ```
   md5sum census-part*
   ```

   Berikut contoh outputnya:

   ```
   e611693805e812ef37f96c9937605e69 census-part00
   63d2d5da159178785bfd6b6a5c635854 census-part01
   95b87c7db852451bb38b3b44a4e6d310 census-part02
   ```

1. Untuk langkah ini, gabungkan MD5 hash secara manual menjadi satu string. Kemudian, jalankan perintah berikut untuk mengubah string menjadi biner dan menghitung MD5 checksum dari nilai biner:

   ```
   echo "e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310" | xxd -r -p | md5sum
   ```

   Berikut contoh outputnya:

   ```
   f453c6dccca969c457efdf9b1361e291 -
   ```

   Nilai hash ini harus sesuai dengan nilai hash dari ETag nilai asli di [Langkah 1](#create-large-file-step1), yang memvalidasi integritas objek. `census_data_file`

Saat Anda menginstruksikan Amazon S3 untuk menggunakan checksum tambahan, Amazon S3 menghitung nilai checksum untuk setiap bagian dan menyimpan nilainya. Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian dari unggahan multibagian yang masih berlangsung, Anda dapat menggunakannya. `list-parts`

Untuk informasi selengkapnya tentang cara kerja checksum dengan objek unggahan multibagian, lihat. [Memeriksa integritas objek di Amazon S3](checking-object-integrity.md)

## Langkah 9: Verifikasi integritas objek dengan checksum tambahan
<a name="verify-object-integrity-sha256-step9"></a>

Pada langkah ini, tutorial ini menggunakan SHA-256 sebagai checksum tambahan untuk memvalidasi integritas objek. Jika Anda telah menggunakan checksum tambahan yang berbeda, gunakan nilai checksum itu sebagai gantinya.

**Untuk memverifikasi integritas objek dengan SHA256**

1. Jalankan perintah berikut di terminal Anda, termasuk `--checksum-mode enabled` argumen, untuk menampilkan `ChecksumSHA256` nilai objek Anda:

   ```
   aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file --checksum-mode enabled
   ```

   Berikut contoh outputnya:

   ```
   {
       "AcceptRanges": "bytes",
       "LastModified": "2024-07-26T19:04:13+00:00",
       "ContentLength": 16106127360,
       "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3",
       "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"",
       "ContentType": "binary/octet-stream",
       "ServerSideEncryption": "AES256",
       "Metadata": {}
   }
   ```

1. Gunakan perintah berikut untuk memecahkan kode `ChecksumSHA256` nilai untuk masing-masing bagian menjadi base64 dan menyimpannya ke dalam file biner yang disebut. `outfile` Nilai-nilai ini dapat ditemukan di `parts.json` file Anda. Ganti contoh string base64 dengan nilai aktual `ChecksumSHA256` Anda.

   ```
   echo "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" | base64 --decode >> outfile
   echo "xCdgs1K5Bm4jWETYw/CmGYr+m6O2DcGfpckx5NVokvE=" | base64 --decode >> outfile
   echo "f5wsfsa5bB+yXuwzqG1Bst91uYneqGD3CCidpb54mAo=" | base64 --decode >> outfile
   ```

1. Jalankan perintah berikut untuk menghitung SHA256 checksum dari`outfile`:

   ```
   sha256sum outfile
   ```

   Berikut contoh outputnya:

   ```
   688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile
   ```

   Pada langkah berikutnya, ambil nilai hash dan ubah menjadi nilai biner. Nilai biner ini harus sesuai dengan `ChecksumSHA256` nilai dari [Langkah 1](#create-large-file-step1).

1. [Ubah SHA256 checksum dari [Langkah 3](#create-multipart-upload-step3) menjadi biner, lalu kodekan ke base64 untuk memverifikasi bahwa itu cocok dengan `ChecksumSHA256` nilai dari Langkah 1:](#create-large-file-step1)

   ```
   echo "688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9" | xxd -r -p | base64
   ```

   Berikut contoh outputnya:

   ```
   aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=
   ```

   Output ini harus mengkonfirmasi bahwa output base64 cocok dengan `ChecksumSHA256` nilai dari output `head-object` perintah. Jika output cocok dengan nilai checksum, maka objek tersebut valid.

**penting**  
Saat Anda menginstruksikan Amazon S3 untuk menggunakan checksum tambahan, Amazon S3 menghitung nilai checksum untuk setiap bagian dan menyimpan nilai ini.
Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian dari unggahan multibagian yang masih berlangsung, Anda dapat menggunakan perintah tersebut. `list-parts`

## Langkah 10: Bersihkan sumber daya Anda
<a name="clean-up-step10"></a>

Jika Anda ingin membersihkan file yang dibuat dalam tutorial ini, gunakan metode berikut. Untuk petunjuk cara menghapus file yang diunggah ke bucket S3 Anda, lihat. [Menghapus objek Amazon S3](DeletingObjects.md)

**Hapus file lokal yang dibuat di [Langkah 1](#create-large-file-step1):**

Untuk menghapus file yang Anda buat untuk upload multipart Anda, jalankan perintah berikut dari direktori kerja Anda:

```
rm census-data.bin census-part* outfile parts.json
```

# Batas unggahan multibagian Amazon S3
<a name="qfacts"></a>

Unggahan multibagian memungkinkan Anda untuk mengunggah satu objek sebagai kumpulan bagian. Setiap bagian merupakan bagian data objek yang saling berkaitan. Setelah semua bagian objek Anda diunggah, Amazon S3 merakit bagian-bagian ini dan menciptakan objek. Secara umum, saat ukuran objek Anda mencapai 100 MB, Anda harus mempertimbangkan untuk menggunakan unggahan multibagian daripada mengunggah objek tersebut dalam satu operasi. Untuk informasi lebih lanjut tentang unggahan multibagian, lihat [Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3](mpuoverview.md). 

Tabel berikut ini menyediakan spesifikasi inti unggahan multibagian. Ini termasuk ukuran objek maksimum, jumlah maksimum bagian, ukuran bagian maksimum, dan banyak lagi. Tidak ada batas ukuran minimum pada bagian terakhir dari unggahan multibagian Anda.


| Item | Spesifikasi | 
| --- | --- | 
| Ukuran objek maksimum | 48,8 TiB  | 
| Jumlah maksimum bagian per unggahan | 10.000 | 
| Nomor bagian | 1 hingga 10.000 (inklusif) | 
| Ukuran bagian | 5 MiB hingga 5 GiB. Tidak ada batas ukuran minimum pada bagian terakhir dari unggahan multibagian Anda. | 
| Jumlah maksimum bagian yang ditampilkan untuk permintaan daftar bagian | 1000  | 
| Jumlah maksimum unggahan multibagian yang dikembalikan dalam permintaan unggahan multibagian daftar | 1000  | 