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 objek tunggal sebagai sekumpulan 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 upload multipart.
-
Mulai unggahan sebelum Anda mengetahui ukuran akhir objek–Anda dapat mengunggah sebuah objek selagi Anda membuatnya.
Sebaiknya gunakan unggahan multipart dengan cara berikut:
-
Jika Anda mengunggah objek besar melalui jaringan bandwidth tinggi yang stabil, gunakan unggahan multibagian untuk memaksimalkan penggunaan bandwidth yang tersedia dengan mengunggah bagian objek secara paralel untuk kinerja multi-utas.
-
Jika Anda mengunggah melalui jaringan berbintik-bintik, gunakan unggahan multibagian untuk meningkatkan ketahanan terhadap kesalahan jaringan dengan menghindari restart unggahan. Saat menggunakan unggahan multipart, Anda perlu mencoba lagi mengunggah hanya bagian yang terganggu 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 di bucket direktori, proses upload multipart mirip dengan proses menggunakan unggahan multipart untuk mengunggah objek ke bucket tujuan umum. Namun, ada beberapa perbedaan penting.
Untuk informasi selengkapnya tentang menggunakan unggahan multibagian untuk mengunggah objek ke S3 Express One Zone, lihat topik berikut.
Proses pengunggahan multibagian
Pengunggahan multipart adalah proses tiga langkah:
-
Anda memulai upload.
-
Anda mengunggah bagian objek.
-
Setelah Anda mengunggah semua bagian, Anda menyelesaikan unggahan multipart.
Setelah menerima permintaan unggahan multipart lengkap, Amazon S3 membangun objek dari bagian yang diunggah, dan Anda kemudian dapat mengakses objek seperti 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 multipart dengan S3 Express One Zone, nomor bagian multipart harus nomor bagian berurutan. Jika Anda mencoba menyelesaikan permintaan unggahan multipart dengan nomor bagian yang tidak berurutan, kesalahan HTTP 400 Bad Request (Urutan Bagian Tidak Valid) akan dihasilkan.
Nomor bagian secara unik mengidentifikasi bagian dan posisinya di 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 diganti.
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 minimal diatur ke enkripsi sisi server dengan kunci terkelola Amazon S3 ()SSE-S3. Untuk bucket direktori, SSE-S3 dan enkripsi sisi server dengan AWS KMS kunci (SSE-KMS) didukung. Untuk informasi selengkapnya, lihat Perlindungan data dan enkripsi.
Penyelesaian unggahan multibagian
Saat Anda menyelesaikan unggahan multipart, Amazon S3 membuat objek dengan menggabungkan bagian-bagian dalam urutan menaik berdasarkan nomor bagian. Setelah permintaan selesai sepenuhnya, bagiantersebut tidak akan ada lagi.
Per mintaan unggahan multipart 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 bagian 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 multipart, lihat Refer ListParts ensi API Layanan Penyimpanan Sederhana Amazon.
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 ini:
-
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 GetObject atau. HeadObject Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian dari unggahan multibagian yang masih dalam proses, Anda dapat menggunakan ListParts.
Saat menggunakan algoritma checksum sebelumnya, nomor bagian multipart harus menggunakan nomor bagian berurutan. Jika Anda mencoba menyelesaikan permintaan unggahan multipart dengan nomor bagian yang tidak berurutan, Amazon S3 menghasilkan kesalahan HTTP 400 Bad Request (Urutan Bagian Tidak Valid).
Untuk informasi selengkapnya tentang cara kerja checksum dengan objek upload multipart, lihat. Memeriksa integritas objek di Amazon S3
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 upload 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.
Pembuatan versi tidak didukung untuk objek yang disimpan dalam bucket direktori.
Upload 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 multipart, 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 multipart yang tidak lengkap, terlepas dari kelas penyimpanan yang ditentukan. Untuk informasi selengkapnya tentang harga, lihat Harga Amazon S3.
Jika permintaan unggahan 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 multipart untuk membuat objek atau membatalkan unggahan multipart untuk menghapus bagian yang diunggah.
Sebelum Anda dapat menghapus bucket direktori, Anda harus menyelesaikan atau membatalkan semua upload multipart yang sedang berlangsung. Bucket direktori tidak mendukung konfigurasi Siklus Hidup S3. Jika perlu, Anda dapat membuat daftar unggahan multipart aktif Anda, lalu membatalkan unggahan, lalu menghapus bucket Anda.
Operasi dan izin API unggah 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 upload 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 (salinan) |
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 upload multipart, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.
Agar inisiator menyelesaikan upload multipart, pemilik bucket harus mengizinkan inisiator untuk melakukan s3express:CreateSession tindakan pada objek.
|
| Pembatalan sebuah unggahan multipart |
Untuk membatalkan upload multipart, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan tersebut.
Agar inisiator membatalkan unggahan multipart, inisiator harus diberikan akses izin eksplisit untuk melakukan tindakan. s3express:CreateSession
|
| Daftar bagian |
Untuk mencantumkan bagian dalam unggahan multipart, Anda harus diizinkan untuk melakukan s3express:CreateSession tindakan pada bucket direktori.
|
| Membuat daftar unggahan multibagian yang sedang berlangsung |
Untuk mencantumkan unggahan multipart yang sedang berlangsung ke bucket, Anda harus diizinkan untuk melakukan s3:ListBucketMultipartUploads tindakan pada bucket tersebut.
|
Dukungan operasi API untuk unggahan multipart
Bagian berikut dalam Referensi API Layanan Penyimpanan Sederhana Amazon menjelaskan operasi API REST Amazon S3 untuk upload multipart.
Contoh
Untuk menggunakan unggahan multipart untuk mengunggah objek ke S3 Express One Zone dalam bucket direktori, lihat contoh berikut.
Membuat unggahan multibagian
Untuk bucket direktori, saat Anda melakukan CreateMultipartUpload operasi dan UploadPartCopy operasi, enkripsi default bucket harus menggunakan konfigurasi enkripsi yang diinginkan, dan header permintaan yang Anda berikan dalam CreateMultipartUpload permintaan harus sesuai dengan konfigurasi enkripsi default dari bucket tujuan.
Contoh berikut menunjukkan cara membuat unggahan multipart.
- SDK for Java 2.x
-
contoh
/**
* 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
-
contoh
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. AWS CLI Perintah ini memulai upload multipart ke bucket direktori bucket-base-name -- zone-id --x-s3 untuk objek. KEY_NAME Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api create-multipart-upload --bucket bucket-base-name--zone-id--x-s3 --key KEY_NAME
Untuk informasi selengkapnya, lihat create-multipart-upload di. 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 objek tunggal menjadi beberapa bagian dan kemudian mengunggah bagian-bagian tersebut ke bucket direktori dengan menggunakan SDK untuk Java 2.x.
contoh
/**
* 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 objek tunggal menjadi beberapa bagian dan kemudian mengunggah bagian-bagian tersebut ke bucket direktori dengan menggunakan SDK untuk Python.
contoh
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 objek tunggal menjadi beberapa bagian dan kemudian mengunggah bagian-bagian tersebut ke bucket direktori dengan menggunakan AWS CLI. Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api upload-part --bucket bucket-base-name--zone-id--x-s3 --key KEY_NAME --part-number 1 --body LOCAL_FILE_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA"
Untuk informasi selengkapnya, lihat bagian unggah di. AWS Command Line Interface
Menyelesaikan unggahan multibagian
Contoh berikut menunjukkan cara menyelesaikan upload multipart.
- SDK for Java 2.x
-
Contoh berikut menunjukkan cara menyelesaikan upload multipart dengan menggunakan SDK untuk Java 2.x.
contoh
/**
* 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.
contoh
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. AWS CLI Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api complete-multipart-upload --bucket bucket-base-name--zone-id--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA" --multipart-upload file://parts.json
Contoh ini mengambil struktur JSON yang menjelaskan bagian-bagian unggahan multipart yang harus dirakit kembali ke dalam file lengkap. Dalam contoh ini, file:// awalan digunakan untuk memuat struktur JSON dari file di folder lokal bernamaparts.
bagian.json:
parts.json
{
"Parts": [
{
"ETag": "6b78c4a64dd641a58dac8d9258b88147",
"PartNumber": 1
}
]
}
Untuk informasi selengkapnya, lihat complete-multipart-upload di. AWS Command Line Interface
Membatalkan unggahan multibagian
Contoh berikut menunjukkan cara membatalkan upload multipart.
- SDK for Java 2.x
-
Contoh berikut menunjukkan cara membatalkan upload multipart dengan menggunakan SDK untuk Java 2.x.
contoh
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.
contoh
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 unggahan multipart dengan menggunakan. AWS CLI Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api abort-multipart-upload --bucket bucket-base-name--zone-id--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEAX5hFw-MAQAAAAB0OxUFeA7LTbWWFS8WYwhrxDxTIDN-pdEEq_agIHqsbg"
Untuk informasi selengkapnya, lihat abort-multipart-upload di. AWS Command Line Interface
Membuat operasi salin unggahan multibagian
Untuk mengenkripsi salinan bagian objek baru dalam bucket direktori dengan SSE-KMS, Anda harus menentukan SSE-KMS konfigurasi enkripsi default bucket direktori dengan kunci KMS (khususnya, kunci yang dikelola pelanggan). Kunci yang dikelola AWS (aws/s3) tidak didukung. SSE-KMS Konfigurasi Anda hanya dapat mendukung 1 kunci yang dikelola pelanggan per bucket direktori selama masa pakai bucket. Setelah menentukan kunci yang dikelola pelanggan untuk SSE-KMS, Anda tidak dapat mengganti kunci yang dikelola pelanggan untuk SSE-KMS konfigurasi bucket. Anda tidak dapat menentukan pengaturan enkripsi sisi server untuk salinan bagian objek baru dengan SSE-KMS header UploadPartCopy permintaan. Juga, header permintaan yang Anda berikan dalam CreateMultipartUpload permintaan harus sesuai dengan konfigurasi enkripsi default dari bucket tujuan.
S3 Bucket Keys tidak didukung, saat Anda menyalin objek SSE-KMS terenkripsi dari bucket tujuan umum ke bucket direktori, dari bucket direktori ke bucket tujuan umum, atau antar bucket direktori, melalui UploadPartCopy. Dalam hal ini, Amazon S3 melakukan panggilan ke AWS KMS setiap kali permintaan salinan dibuat untuk suatu KMS-encrypted objek.
Contoh berikut menunjukkan cara menyalin objek 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 untuk Java 2.x.
contoh
/**
* 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.
contoh
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 multipart untuk menyalin objek secara terprogram dari satu bucket ke bucket direktori menggunakan. AWS CLI Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api upload-part-copy --bucket bucket-base-name--zone-id--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 selengkapnya, lihat unggahan-bagian-salinan di. AWS Command Line Interface
Mendaftarkan unggahan multibagian yang sedang berlangsung
Untuk mencantumkan unggahan multipart yang sedang berlangsung ke bucket direktori, Anda dapat menggunakan SDK, AWS atau. AWS CLI
- SDK for Java 2.x
-
Contoh berikut menunjukkan cara membuat daftar upload multipart yang sedang berlangsung (tidak lengkap) dengan menggunakan SDK untuk Java 2.x.
contoh
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 upload multipart yang sedang berlangsung (tidak lengkap) dengan menggunakan SDK untuk Python.
contoh
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 multibagian yang sedang berlangsung (tidak lengkap) dengan menggunakan. AWS CLI Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api list-multipart-uploads --bucket bucket-base-name--zone-id--x-s3
Untuk informasi selengkapnya, lihat list-multipart- uploads di. AWS Command Line Interface
Mendaftarkan bagian-bagian dari unggahan multipart
Contoh berikut menunjukkan cara membuat daftar bagian-bagian dari upload multipart ke bucket direktori.
- SDK for Java 2.x
-
Contoh berikut menunjukkan cara membuat daftar bagian-bagian dari upload multipart ke bucket direktori dengan menggunakan SDK untuk 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-bagian dari upload 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-bagian dari upload multipart ke bucket direktori dengan menggunakan. AWS CLI Untuk menggunakan perintah ganti user input placeholders dengan informasi Anda sendiri.
aws s3api list-parts --bucket bucket-base-name--zone-id--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA"
Untuk informasi selengkapnya, lihat bagian daftar di. AWS Command Line Interface