Menggunakan unggahan multibagian dengan bucket direktori - Amazon Simple Storage Service

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

Menggunakan unggahan multibagian dengan bucket direktori

Anda dapat menggunakan proses upload multipart untuk mengunggah satu objek 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. Secara umum, saat ukuran objek Anda mencapai 100 MB, Anda harus mempertimbangkan untuk menggunakan unggahan multibagian daripada mengunggah objek tersebut dalam satu operasi.

Penggunaan unggahan multibagian memberikan keuntungan sebagai berikut:

  • Peningkatan throughput–Anda dapat mengunggah bagian-bagian secara paralel untuk meningkatkan throughput.

  • Pemulihan cepat dari masalah jaringan apa pun - Ukuran bagian yang lebih kecil meminimalkan dampak memulai ulang unggahan yang gagal karena kesalahan jaringan.

  • Jeda dan pelanjutan pengunggahan objek–Anda dapat mengunggah bagian-bagian objek kapan saja. Setelah Anda memulai unggahan multipart, tidak ada tanggal kedaluwarsa. Anda harus secara eksplisit menyelesaikan atau membatalkan unggahan multipart.

  • Mulai unggahan sebelum Anda mengetahui ukuran akhir objek–Anda dapat mengunggah sebuah objek selagi Anda membuatnya.

Kami menyarankan Anda menggunakan unggahan multipart 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 perlu mencoba mengunggah kembali hanya bagian yang terputus selama pengunggahan. Anda tidak perlu mengunggah ulang objek Anda dari awal.

Saat Anda menggunakan unggahan multibagian untuk mengunggah objek ke kelas penyimpanan Amazon S3 Express One Zone dalam bucket direktori, proses pengunggahan multibagian mirip dengan proses menggunakan unggahan multibagian untuk mengunggah objek ke bucket tujuan umum. Namun, ada beberapa perbedaan penting.

Untuk informasi selengkapnya tentang penggunaan unggahan multibagian untuk mengunggah objek ke S3 Express One Zone, lihat topik berikut.

Proses pengunggahan multipart

Unggahan multipart adalah proses tiga langkah:

  • Anda memulai unggahan.

  • Anda mengunggah bagian objek.

  • Setelah Anda mengunggah semua bagian, Anda menyelesaikan unggahan multibagian.

Setelah menerima permintaan upload multipart lengkap, Amazon S3 membuat objek dari bagian yang diunggah, dan Anda kemudian dapat mengakses objek seperti halnya objek lain di bucket Anda.

Menginisiasi unggahan multibagian

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 membatalkan sebuah unggahan.

Pengunggahan bagian-bagian

Saat mengunggah sebuah bagian, selain ID pengunggahan, Anda harus menentukan nomor bagiannya. Saat Anda menggunakan unggahan multibagian dengan S3 Express One Zone, nomor bagian multipart harus berupa nomor bagian yang berurutan. Jika Anda mencoba menyelesaikan permintaan unggahan multibagian dengan nomor bagian yang tidak berurutan, kesalahan HTTP 400 Bad Request (Pesanan Bagian Tidak Valid) akan dihasilkan.

Nomor bagian secara unik mengidentifikasi bagian dan posisinya dalam objek yang Anda unggah. Jika Anda mengunggah bagian baru dengan menggunakan nomor bagian yang sama dengan bagian yang diunggah sebelumnya, bagian yang diunggah sebelumnya akan ditimpa.

Kapan pun Anda mengunggah sebuah bagian, Amazon S3 akan menampilkan header tag entitas (ETag) dalam responsnya. Untuk setiap unggahan bagian, Anda harus mencatat nomor bagian dan nilai ETag. Nilai ETag untuk semua unggahan bagian objek akan tetap sama, tetapi setiap bagian akan diberi nomor bagian yang berbeda. Anda harus memasukkan nilai-nilai ini dalam permintaan selanjutnya untuk menyelesaikan unggahan multibagian.

Amazon S3 secara otomatis mengenkripsi semua objek baru yang diunggah ke bucket S3. Saat melakukan pengunggahan multibagian, jika Anda tidak menentukan informasi enkripsi dalam permintaan, pengaturan enkripsi bagian yang diunggah diatur ke konfigurasi enkripsi default bucket tujuan. Konfigurasi enkripsi default bucket Amazon S3 selalu diaktifkan dan diatur secara minimum ke enkripsi di sisi server dengan kunci terkelola Amazon S3 (SSE-S3). Untuk bucket direktori, hanya SSE-S3 yang didukung. Untuk informasi selengkapnya, lihat Enkripsi Sisi Server dengan kunci terkelola Amazon S3 (SSE-S3).

Penyelesaian unggahan multibagian

Saat Anda menyelesaikan unggahan multibagian, Amazon S3 membuat objek dengan menggabungkan bagian-bagian dalam urutan menaik berdasarkan nomor bagian. Setelah permintaan selesai sepenuhnya, bagiantersebut tidak akan ada lagi.

Permintaan unggahan multibagian lengkap Anda harus menyertakan ID unggahan dan daftar nomor bagian dan nilai ETag yang sesuai. Respons Amazon S3 mencakup sebuah ETag yang secara unik mengidentifikasi data objek gabungan. ETag ini bukanlah hash MD5 dari data objek.

Pendaftaran unggahan multibagian

Anda dapat mendaftar bagian-bagian dari unggahan multibagian tertentu atau semua unggahan multibagian yang sedang berlangsung. Operasi daftar bagian menampilkan informasi bagian yang telah 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 multibagian, Anda harus menggunakan penomoran halaman untuk mengambil semua bagian.

Daftar suku cadang yang dikembalikan tidak termasuk 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 dibatalkan. 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. Jangan menggunakan hasil pendaftaran ini saat mengirim permintaan selesaikan unggahan multibagian. Sebaliknya, simpan daftar nomor bagian Anda sendiri yang Anda tentukan saat mengunggah bagian dan nilai ETag yang ditampilkan oleh Amazon S3.

Untuk informasi selengkapnya tentang daftar unggahan multibagian, lihat ListPartsdi Referensi API Amazon Simple Storage Service.

Checksum dengan operasi unggahan multibagian

Saat Anda mengunggah objek, Anda dapat menentukan algoritma checksum untuk memeriksa integritas objek. MD5 tidak didukung untuk bucket direktori. Anda dapat menentukan salah satu algoritma pemeriksaan integritas data Secure Hash Algorithms (SHA) atau Cyclic Redundancy Check (CRC) berikut:

  • CRC32

  • CRC32C

  • SHA-1

  • SHA-256

Anda dapat menggunakan Amazon S3 REST API atau AWS SDK untuk mengambil nilai checksum untuk masing-masing bagian dengan menggunakan atau. GetObject HeadObject Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian dari unggahan multibagian yang masih dalam proses, Anda dapat menggunakan ListParts.

penting

Saat menggunakan algoritma checksum sebelumnya, nomor bagian multipart harus menggunakan nomor bagian berurutan. Jika Anda mencoba menyelesaikan permintaan unggahan multibagian dengan nomor bagian yang tidak berurutan, Amazon S3 menghasilkan kesalahan HTTP 400 Bad Request (Pesanan Bagian Tidak Valid).

Untuk informasi selengkapnya tentang cara kerja checksum dengan objek multibagian, lihat Memeriksa integritas objek.

Operasi pengunggahan multibagian serentak

Dalam lingkungan pengembangan terdistribusi, aplikasi Anda dapat memulai beberapa pembaruan pada objek yang sama secara bersamaan. Misalnya, aplikasi Anda mungkin memulai beberapa unggahan multipart dengan 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. Untuk S3 Express One Zone, waktu pembuatan objek adalah tanggal penyelesaian unggahan multibagian.

penting

Pembuatan versi tidak didukung untuk objek yang disimpan dalam bucket direktori.

Unggahan dan harga multipart

Setelah Anda memulai unggahan multibagian, Amazon S3 akan menyimpan semua bagian hingga Anda menyelesaikan atau membatalkan unggahan. Sepanjang masa pakainya, Anda akan ditagih untuk semua penyimpanan, bandwidth, dan permintaan untuk unggahan multibagian ini dan bagian terkaitnya. Jika Anda membatalkan unggahan multibagian, Amazon S3 menghapus artefak unggahan dan bagian apa pun yang telah Anda unggah, dan Anda tidak lagi ditagih untuk itu. Tidak ada biaya penghapusan awal untuk menghapus unggahan multibagian yang tidak lengkap, terlepas dari kelas penyimpanan yang ditentukan. Untuk informasi selengkapnya tentang harga, lihat Harga Amazon S3.

penting

Jika permintaan upload multipart lengkap tidak berhasil dikirim, bagian objek tidak dirakit dan objek tidak dibuat. Anda akan ditagih untuk semua penyimpanan yang terkait dengan bagian yang diunggah. Penting bagi Anda untuk menyelesaikan unggahan multibagian agar objek dibuat atau membatalkan unggahan multibagian untuk menghapus bagian yang diunggah.

Sebelum dapat menghapus bucket direktori, Anda harus menyelesaikan atau membatalkan semua unggahan multipart yang sedang berlangsung. Bucket direktori tidak mendukung konfigurasi Siklus Hidup S3. Jika perlu, Anda dapat mencantumkan unggahan multibagian aktif, lalu membatalkan unggahan, lalu menghapus bucket.

Operasi dan izin API unggahan multibagian

Untuk mengizinkan akses ke operasi API manajemen objek pada bucket direktori, Anda memberikan s3express:CreateSession izin dalam kebijakan bucket atau kebijakan berbasis identitas AWS Identity and Access Management (IAM).

Anda harus memiliki izin yang diperlukan untuk menggunakan operasi pengunggahan multibagian. Anda dapat menggunakan kebijakan bucket atau kebijakan berbasis identitas IAM untuk memberikan izin kepada prinsipal IAM untuk melakukan operasi ini. Tabel berikut mencantumkan izin yang diperlukan untuk berbagai operasi pengunggahan multibagian.

Anda dapat mengidentifikasi inisiator unggahan multipart melalui elemen. Initiator Jika inisiator adalah Akun AWS, elemen ini memberikan informasi yang sama dengan Owner elemen. Jika inisiator adalah seorang pengguna IAM, elemen ini akan menyediakan ARN pengguna dan nama tampilan.

Tindakan Izin yang diperlukan

Membuat unggahan multibagian

Untuk membuat unggahan multipart, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Memulai unggahan multipart

Untuk memulai unggahan multipart, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Unggah bagian

Untuk mengunggah bagian, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Agar inisiator dapat mengunggah bagian, pemilik bucket harus mengizinkan inisiator untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Unggah bagian (salin)

Untuk mengunggah bagian, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Agar inisiator dapat mengunggah bagian untuk sebuah objek, pemilik bucket harus mengizinkan inisiator untuk melakukan tindakan s3express:CreateSession pada objek.

Selesaikan unggahan multibagian

Untuk menyelesaikan unggahan multibagian, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Agar inisiator dapat menyelesaikan unggahan multibagian, pemilik bucket harus mengizinkan inisiator untuk melakukan s3express:CreateSession tindakan pada objek.

Pembatalan sebuah unggahan multipart

Untuk membatalkan unggahan multibagian, Anda harus diizinkan untuk melakukan tindakan. s3express:CreateSession

Agar inisiator membatalkan unggahan multibagian, inisiator harus diberikan akses izin eksplisit untuk melakukan tindakan. s3express:CreateSession

Daftar bagian

Untuk mencantumkan bagian-bagian dalam unggahan multibagian, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.

Membuat daftar unggahan multibagian yang sedang berlangsung

Untuk membuat daftar unggahan multipart yang sedang berlangsung ke bucket, Anda harus diizinkan melakukan s3:ListBucketMultipartUploads tindakan pada bucket tersebut.

Dukungan operasi API untuk unggahan multipart

Bagian berikut dalam Referensi API Amazon Simple Storage Service menjelaskan operasi Amazon S3 REST API untuk unggahan multipart.

Contoh

Untuk menggunakan unggahan multibagian untuk mengunggah objek ke S3 Express One Zone dalam bucket direktori, lihat contoh berikut.

Membuat unggahan multibagian

Contoh berikut menunjukkan cara membuat unggahan multipart.

SDK for Java 2.x
/** * This method creates a multipart upload request that generates a unique upload ID that is used to track * all the upload parts * * @param s3 * @param bucketName - for example, 'doc-example-bucket--use1-az4--x-s3' * @param key * @return */ private static String createMultipartUpload(S3Client s3, String bucketName, String key) { CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName) .key(key) .build(); String uploadId = null; try { CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest); uploadId = response.uploadId(); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return uploadId;
SDK for Python
def create_multipart_upload(s3_client, bucket_name, key_name): ''' Create a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: The destination bucket for the multipart upload :param key_name: The key name for the object to be uploaded :return: The UploadId for the multipart upload if created successfully, else None ''' try: mpu = s3_client.create_multipart_upload(Bucket = bucket_name, Key = key_name) return mpu['UploadId'] except ClientError as e: logging.error(e) return None

Contoh ini menunjukkan cara membuat unggahan multipart ke bucket direktori dengan menggunakan file. AWS CLIPerintah ini memulai unggahan multipart ke direktori bucket bucket-base-name-- azid --x-s3 untuk objek KEY_NAME. Untuk menggunakan perintah, ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api create-multipart-upload --bucket bucket-base-name--azid--x-s3 --key KEY_NAME

Untuk informasi lebih lanjut, lihat create-multipart-uploaddi AWS Command Line Interface.

Mengunggah bagian-bagian dari unggahan multipart

Contoh berikut menunjukkan cara mengunggah bagian dari unggahan multipart.

SDK for Java 2.x

Contoh berikut menunjukkan cara memecah satu objek menjadi beberapa bagian dan kemudian mengunggah bagian-bagian tersebut ke bucket direktori dengan menggunakan SDK for Java 2.x.

/** * This method creates part requests and uploads individual parts to S3 and then returns all the completed parts * * @param s3 * @param bucketName * @param key * @param uploadId * @throws IOException */ private static ListCompletedPartmultipartUpload(S3Client s3, String bucketName, String key, String uploadId, String filePath) throws IOException { int partNumber = 1; ListCompletedPart completedParts = new ArrayList<>(); ByteBuffer bb = ByteBuffer.allocate(1024 * 1024 * 5); // 5 MB byte buffer // read the local file, breakdown into chunks and process try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) { long fileSize = file.length(); int position = 0; while (position < fileSize) { file.seek(position); int read = file.getChannel().read(bb); bb.flip(); // Swap position and limit before reading from the buffer. UploadPartRequest uploadPartRequest = UploadPartRequest.builder() .bucket(bucketName) .key(key) .uploadId(uploadId) .partNumber(partNumber) .build(); UploadPartResponse partResponse = s3.uploadPart( uploadPartRequest, RequestBody.fromByteBuffer(bb)); CompletedPart part = CompletedPart.builder() .partNumber(partNumber) .eTag(partResponse.eTag()) .build(); completedParts.add(part); bb.clear(); position += read; partNumber++; } } catch (IOException e) { throw e; } return completedParts; }
SDK for Python

Contoh berikut menunjukkan cara memecah satu objek menjadi beberapa bagian dan kemudian mengunggah bagian-bagian tersebut ke bucket direktori dengan menggunakan SDK untuk Python.

def multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_size): ''' Break up a file into multiple parts and upload those parts to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Destination bucket for the multipart upload :param key_name: Key name for object to be uploaded and for the local file that's being uploaded :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_size: The size parts that the object will be broken into, in bytes. Minimum 5 MiB, Maximum 5 GiB. There is no minimum size for the last part of your multipart upload. :return: part_list for the multipart upload if all parts are uploaded successfully, else None ''' part_list = [] try: with open(key_name, 'rb') as file: part_counter = 1 while True: file_part = file.read(part_size) if not len(file_part): break upload_part = s3_client.upload_part( Bucket = bucket_name, Key = key_name, UploadId = mpu_id, Body = file_part, PartNumber = part_counter ) part_list.append({'PartNumber': part_counter, 'ETag': upload_part['ETag']}) part_counter += 1 except ClientError as e: logging.error(e) return None return part_list

Contoh ini menunjukkan cara memecah satu objek menjadi beberapa bagian dan kemudian mengunggah bagian-bagian tersebut ke bucket direktori dengan menggunakan file AWS CLI. Untuk menggunakan perintah, ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api upload-part --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --part-number 1 --body LOCAL_FILE_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA"

Untuk informasi selengkapnya, lihat bagian unggahan di. AWS Command Line Interface

Menyelesaikan unggahan multibagian

Contoh berikut menunjukkan cara menyelesaikan unggahan multipart.

SDK for Java 2.x

Contoh berikut menunjukkan cara menyelesaikan upload multipart dengan menggunakan SDK for Java 2.x.

/** * This method completes the multipart upload request by collating all the upload parts * @param s3 * @param bucketName - for example, 'doc-example-bucket--usw2-az1--x-s3' * @param key * @param uploadId * @param uploadParts */ private static void completeMultipartUpload(S3Client s3, String bucketName, String key, String uploadId, ListCompletedPart uploadParts) { CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder() .parts(uploadParts) .build(); CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder() .bucket(bucketName) .key(key) .uploadId(uploadId) .multipartUpload(completedMultipartUpload) .build(); s3.completeMultipartUpload(completeMultipartUploadRequest); } public static void multipartUploadTest(S3Client s3, String bucketName, String key, String localFilePath) { System.out.println("Starting multipart upload for: " + key); try { String uploadId = createMultipartUpload(s3, bucketName, key); System.out.println(uploadId); ListCompletedPart parts = multipartUpload(s3, bucketName, key, uploadId, localFilePath); completeMultipartUpload(s3, bucketName, key, uploadId, parts); System.out.println("Multipart upload completed for: " + key); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Contoh berikut menunjukkan cara menyelesaikan upload multipart dengan menggunakan SDK untuk Python.

def complete_multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_list): ''' Completes a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: The destination bucket for the multipart upload :param key_name: The key name for the object to be uploaded :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_list: The list of uploaded part numbers with their associated ETags :return: True if the multipart upload was completed successfully, else False ''' try: s3_client.complete_multipart_upload( Bucket = bucket_name, Key = key_name, UploadId = mpu_id, MultipartUpload = { 'Parts': part_list } ) except ClientError as e: logging.error(e) return False return True if __name__ == '__main__': MB = 1024 ** 2 region = 'us-west-2' bucket_name = 'BUCKET_NAME' key_name = 'OBJECT_NAME' part_size = 10 * MB s3_client = boto3.client('s3', region_name = region) mpu_id = create_multipart_upload(s3_client, bucket_name, key_name) if mpu_id is not None: part_list = multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_size) if part_list is not None: if complete_multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_list): print (f'{key_name} successfully uploaded through a ultipart upload to {bucket_name}') else: print (f'Could not upload {key_name} hrough a multipart upload to {bucket_name}')

Contoh ini menunjukkan cara menyelesaikan unggahan multipart untuk bucket direktori dengan menggunakan file. AWS CLI Untuk menggunakan perintah, ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api complete-multipart-upload --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA" --multipart-upload file://parts.json

Contoh ini mengambil struktur JSON yang menjelaskan bagian-bagian dari upload multipart yang harus dipasang kembali ke dalam file lengkap. Dalam contoh ini, file:// awalan digunakan untuk memuat struktur JSON dari file di folder lokal bernama. parts

parts.json:

parts.json { "Parts": [ { "ETag": "6b78c4a64dd641a58dac8d9258b88147", "PartNumber": 1 } ] }

Untuk informasi lebih lanjut, lihat complete-multipart-uploaddi AWS Command Line Interface.

Membatalkan unggahan multibagian

Contoh berikut menunjukkan cara membatalkan unggahan multipart.

SDK for Java 2.x

Contoh berikut menunjukkan cara membatalkan upload multipart dengan menggunakan SDK for Java 2.x.

public static void abortMultiPartUploads( S3Client s3, String bucketName ) { try { ListMultipartUploadsRequest listMultipartUploadsRequest = ListMultipartUploadsRequest.builder() .bucket(bucketName) .build(); ListMultipartUploadsResponse response = s3.listMultipartUploads(listMultipartUploadsRequest); ListMultipartUpload uploads = response.uploads(); AbortMultipartUploadRequest abortMultipartUploadRequest; for (MultipartUpload upload: uploads) { abortMultipartUploadRequest = AbortMultipartUploadRequest.builder() .bucket(bucketName) .key(upload.key()) .uploadId(upload.uploadId()) .build(); s3.abortMultipartUpload(abortMultipartUploadRequest); } } catch (S3Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Contoh berikut menunjukkan cara membatalkan upload multipart dengan menggunakan SDK untuk Python.

import logging import boto3 from botocore.exceptions import ClientError def abort_multipart_upload(s3_client, bucket_name, key_name, upload_id): ''' Aborts a partial multipart upload in a directory bucket. :param s3_client: boto3 S3 client :param bucket_name: Bucket where the multipart upload was initiated - for example, 'doc-example-bucket--usw2-az1--x-s3' :param key_name: Name of the object for which the multipart upload needs to be aborted :param upload_id: Multipart upload ID for the multipart upload to be aborted :return: True if the multipart upload was successfully aborted, False if not ''' try: s3_client.abort_multipart_upload( Bucket = bucket_name, Key = key_name, UploadId = upload_id ) except ClientError as e: logging.error(e) return False return True if __name__ == '__main__': region = 'us-west-2' bucket_name = 'BUCKET_NAME' key_name = 'KEY_NAME' upload_id = 'UPLOAD_ID' s3_client = boto3.client('s3', region_name = region) if abort_multipart_upload(s3_client, bucket_name, key_name, upload_id): print (f'Multipart upload for object {key_name} in {bucket_name} bucket has been aborted') else: print (f'Unable to abort multipart upload for object {key_name} in {bucket_name} bucket')

Contoh berikut menunjukkan cara membatalkan upload multipart dengan menggunakan file. AWS CLI Untuk menggunakan perintah, ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api abort-multipart-upload --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEAX5hFw-MAQAAAAB0OxUFeA7LTbWWFS8WYwhrxDxTIDN-pdEEq_agIHqsbg"

Untuk informasi lebih lanjut, lihat abort-multipart-uploaddi AWS Command Line Interface.

Membuat operasi salin unggahan multibagian

Contoh berikut menunjukkan cara menyalin bjects dari satu bucket ke bucket lainnya menggunakan unggahan multipart.

SDK for Java 2.x

Contoh berikut menunjukkan cara menggunakan unggahan multipart untuk menyalin objek secara terprogram dari satu bucket ke bucket lainnya dengan menggunakan SDK for Java 2.x.

/** * This method creates a multipart upload request that generates a unique upload ID that is used to track * all the upload parts. * * @param s3 * @param bucketName * @param key * @return */ private static String createMultipartUpload(S3Client s3, String bucketName, String key) { CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName) .key(key) .build(); String uploadId = null; try { CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest); uploadId = response.uploadId(); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return uploadId; } /** * Creates copy parts based on source object size and copies over individual parts * * @param s3 * @param sourceBucket * @param sourceKey * @param destnBucket * @param destnKey * @param uploadId * @return * @throws IOException */ public static ListCompletedPart multipartUploadCopy(S3Client s3, String sourceBucket, String sourceKey, String destnBucket, String destnKey, String uploadId) throws IOException { // Get the object size to track the end of the copy operation. HeadObjectRequest headObjectRequest = HeadObjectRequest .builder() .bucket(sourceBucket) .key(sourceKey) .build(); HeadObjectResponse response = s3.headObject(headObjectRequest); Long objectSize = response.contentLength(); System.out.println("Source Object size: " + objectSize); // Copy the object using 20 MB parts. long partSize = 20 * 1024 * 1024; long bytePosition = 0; int partNum = 1; ListCompletedPart completedParts = new ArrayList<>(); while (bytePosition < objectSize) { // The last part might be smaller than partSize, so check to make sure // that lastByte isn't beyond the end of the object. long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1); System.out.println("part no: " + partNum + ", bytePosition: " + bytePosition + ", lastByte: " + lastByte); // Copy this part. UploadPartCopyRequest req = UploadPartCopyRequest.builder() .uploadId(uploadId) .sourceBucket(sourceBucket) .sourceKey(sourceKey) .destinationBucket(destnBucket) .destinationKey(destnKey) .copySourceRange("bytes="+bytePosition+"-"+lastByte) .partNumber(partNum) .build(); UploadPartCopyResponse res = s3.uploadPartCopy(req); CompletedPart part = CompletedPart.builder() .partNumber(partNum) .eTag(res.copyPartResult().eTag()) .build(); completedParts.add(part); partNum++; bytePosition += partSize; } return completedParts; } public static void multipartCopyUploadTest(S3Client s3, String srcBucket, String srcKey, String destnBucket, String destnKey) { System.out.println("Starting multipart copy for: " + srcKey); try { String uploadId = createMultipartUpload(s3, destnBucket, destnKey); System.out.println(uploadId); ListCompletedPart parts = multipartUploadCopy(s3, srcBucket, srcKey,destnBucket, destnKey, uploadId); completeMultipartUpload(s3, destnBucket, destnKey, uploadId, parts); System.out.println("Multipart copy completed for: " + srcKey); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Contoh berikut menunjukkan cara menggunakan unggahan multipart untuk menyalin objek secara terprogram dari satu bucket ke bucket lainnya dengan menggunakan SDK untuk Python.

import logging import boto3 from botocore.exceptions import ClientError def head_object(s3_client, bucket_name, key_name): ''' Returns metadata for an object in a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Bucket that contains the object to query for metadata :param key_name: Key name to query for metadata :return: Metadata for the specified object if successful, else None ''' try: response = s3_client.head_object( Bucket = bucket_name, Key = key_name ) return response except ClientError as e: logging.error(e) return None def create_multipart_upload(s3_client, bucket_name, key_name): ''' Create a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Destination bucket for the multipart upload :param key_name: Key name of the object to be uploaded :return: UploadId for the multipart upload if created successfully, else None ''' try: mpu = s3_client.create_multipart_upload(Bucket = bucket_name, Key = key_name) return mpu['UploadId'] except ClientError as e: logging.error(e) return None def multipart_copy_upload(s3_client, source_bucket_name, key_name, target_bucket_name, mpu_id, part_size): ''' Copy an object in a directory bucket to another bucket in multiple parts of a specified size :param s3_client: boto3 S3 client :param source_bucket_name: Bucket where the source object exists :param key_name: Key name of the object to be copied :param target_bucket_name: Destination bucket for copied object :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_size: The size parts that the object will be broken into, in bytes. Minimum 5 MiB, Maximum 5 GiB. There is no minimum size for the last part of your multipart upload. :return: part_list for the multipart copy if all parts are copied successfully, else None ''' part_list = [] copy_source = { 'Bucket': source_bucket_name, 'Key': key_name } try: part_counter = 1 object_size = head_object(s3_client, source_bucket_name, key_name) if object_size is not None: object_size = object_size['ContentLength'] while (part_counter - 1) * part_size <object_size: bytes_start = (part_counter - 1) * part_size bytes_end = (part_counter * part_size) - 1 upload_copy_part = s3_client.upload_part_copy ( Bucket = target_bucket_name, CopySource = copy_source, CopySourceRange = f'bytes={bytes_start}-{bytes_end}', Key = key_name, PartNumber = part_counter, UploadId = mpu_id ) part_list.append({'PartNumber': part_counter, 'ETag': upload_copy_part['CopyPartResult']['ETag']}) part_counter += 1 except ClientError as e: logging.error(e) return None return part_list def complete_multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_list): ''' Completes a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Destination bucket for the multipart upload :param key_name: Key name of the object to be uploaded :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_list: List of uploaded part numbers with associated ETags :return: True if the multipart upload was completed successfully, else False ''' try: s3_client.complete_multipart_upload( Bucket = bucket_name, Key = key_name, UploadId = mpu_id, MultipartUpload = { 'Parts': part_list } ) except ClientError as e: logging.error(e) return False return True if __name__ == '__main__': MB = 1024 ** 2 region = 'us-west-2' source_bucket_name = 'SOURCE_BUCKET_NAME' target_bucket_name = 'TARGET_BUCKET_NAME' key_name = 'KEY_NAME' part_size = 10 * MB s3_client = boto3.client('s3', region_name = region) mpu_id = create_multipart_upload(s3_client, target_bucket_name, key_name) if mpu_id is not None: part_list = multipart_copy_upload(s3_client, source_bucket_name, key_name, target_bucket_name, mpu_id, part_size) if part_list is not None: if complete_multipart_upload(s3_client, target_bucket_name, key_name, mpu_id, part_list): print (f'{key_name} successfully copied through multipart copy from {source_bucket_name} to {target_bucket_name}') else: print (f'Could not copy {key_name} through multipart copy from {source_bucket_name} to {target_bucket_name}')

Contoh berikut menunjukkan cara menggunakan unggahan multibagian untuk menyalin objek secara terprogram dari satu bucket ke bucket direktori menggunakan file. AWS CLI Untuk menggunakan perintah, ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api upload-part-copy --bucket bucket-base-name--azid--x-s3 --key TARGET_KEY_NAME --copy-source SOURCE_BUCKET_NAME/SOURCE_KEY_NAME --part-number 1 --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBnJ4cxKMAQAAAABiNXpOFVZJ1tZcKWib9YKE1C565_hCkDJ_4AfCap2svg"

Untuk informasi lebih lanjut, lihat upload-part-copydi AWS Command Line Interface.

Mencantumkan unggahan multipart yang sedang berlangsung

Untuk mencantumkan unggahan multibagian yang sedang berlangsung ke bucket direktori, Anda dapat menggunakan AWS SDK, atau file. AWS CLI

SDK for Java 2.x

Contoh berikut menunjukkan cara membuat daftar unggahan multipart yang sedang berlangsung (tidak lengkap) dengan menggunakan SDK for Java 2.x.

public static void listMultiPartUploads( S3Client s3, String bucketName) { try { ListMultipartUploadsRequest listMultipartUploadsRequest = ListMultipartUploadsRequest.builder() .bucket(bucketName) .build(); ListMultipartUploadsResponse response = s3.listMultipartUploads(listMultipartUploadsRequest); List MultipartUpload uploads = response.uploads(); for (MultipartUpload upload: uploads) { System.out.println("Upload in progress: Key = \"" + upload.key() + "\", id = " + upload.uploadId()); } } catch (S3Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Contoh berikut menunjukkan cara membuat daftar unggahan multipart yang sedang berlangsung (tidak lengkap) dengan menggunakan SDK untuk Python.

import logging import boto3 from botocore.exceptions import ClientError def list_multipart_uploads(s3_client, bucket_name): ''' List any incomplete multipart uploads in a directory bucket in e specified gion :param s3_client: boto3 S3 client :param bucket_name: Bucket to check for incomplete multipart uploads :return: List of incomplete multipart uploads if there are any, None if not ''' try: response = s3_client.list_multipart_uploads(Bucket = bucket_name) if 'Uploads' in response.keys(): return response['Uploads'] else: return None except ClientError as e: logging.error(e) if __name__ == '__main__': bucket_name = 'BUCKET_NAME' region = 'us-west-2' s3_client = boto3.client('s3', region_name = region) multipart_uploads = list_multipart_uploads(s3_client, bucket_name) if multipart_uploads is not None: print (f'There are {len(multipart_uploads)} ncomplete multipart uploads for {bucket_name}') else: print (f'There are no incomplete multipart uploads for {bucket_name}')

Contoh berikut menunjukkan cara membuat daftar unggahan multipart yang sedang berlangsung (tidak lengkap) dengan menggunakan. AWS CLI Untuk menggunakan perintah ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api list-multipart-uploads --bucket bucket-base-name--azid--x-s3

Untuk informasi lebih lanjut, lihat list-multipart-uploadsdi AWS Command Line Interface.

Cantumkan bagian-bagian dari unggahan multipart

Contoh berikut menunjukkan cara membuat daftar bagian dari unggahan multipart ke bucket direktori.

SDK for Java 2.x

Contoh berikut menunjukkan cara membuat daftar bagian dari unggahan multipart ke bucket direktori dengan menggunakan SDK for Java 2.x.

public static void listMultiPartUploadsParts( S3Client s3, String bucketName, String objKey, String uploadID) { try { ListPartsRequest listPartsRequest = ListPartsRequest.builder() .bucket(bucketName) .uploadId(uploadID) .key(objKey) .build(); ListPartsResponse response = s3.listParts(listPartsRequest); ListPart parts = response.parts(); for (Part part: parts) { System.out.println("Upload in progress: Part number = \"" + part.partNumber() + "\", etag = " + part.eTag()); } } catch (S3Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Contoh berikut menunjukkan cara membuat daftar bagian dari unggahan multipart ke bucket direktori dengan menggunakan SDK untuk Python.

import logging import boto3 from botocore.exceptions import ClientError def list_parts(s3_client, bucket_name, key_name, upload_id): ''' Lists the parts that have been uploaded for a specific multipart upload to a directory bucket. :param s3_client: boto3 S3 client :param bucket_name: Bucket that multipart uploads parts have been uploaded to :param key_name: Name of the object that has parts uploaded :param upload_id: Multipart upload ID that the parts are associated with :return: List of parts associated with the specified multipart upload, None if there are no parts ''' parts_list = [] next_part_marker = '' continuation_flag = True try: while continuation_flag: if next_part_marker == '': response = s3_client.list_parts( Bucket = bucket_name, Key = key_name, UploadId = upload_id ) else: response = s3_client.list_parts( Bucket = bucket_name, Key = key_name, UploadId = upload_id, NextPartMarker = next_part_marker ) if 'Parts' in response: for part in response['Parts']: parts_list.append(part) if response['IsTruncated']: next_part_marker = response['NextPartNumberMarker'] else: continuation_flag = False else: continuation_flag = False return parts_list except ClientError as e: logging.error(e) return None if __name__ == '__main__': region = 'us-west-2' bucket_name = 'BUCKET_NAME' key_name = 'KEY_NAME' upload_id = 'UPLOAD_ID' s3_client = boto3.client('s3', region_name = region) parts_list = list_parts(s3_client, bucket_name, key_name, upload_id) if parts_list is not None: print (f'{key_name} has {len(parts_list)} parts uploaded to {bucket_name}') else: print (f'There are no multipart uploads with that upload ID for {bucket_name} bucket')

Contoh berikut menunjukkan cara membuat daftar bagian dari unggahan multipart ke bucket direktori dengan menggunakan. AWS CLI Untuk menggunakan perintah ganti placeholder input pengguna dengan informasi Anda sendiri.

aws s3api list-parts --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA"

Untuk informasi selengkapnya, lihat bagian daftar di. AWS Command Line Interface