Use CompleteMultipartUpload
with an AWS SDK or CLI
The following code examples show how to use CompleteMultipartUpload
.
Action examples are code excerpts from larger programs and must be run in context. You can see this action in
context in the following code examples:
- C++
-
- SDK for C++
-
Aws::S3::Model::CompleteMultipartUploadOutcome AwsDoc::S3::completeMultipartUpload(const Aws::String &bucket,
const Aws::String &key,
const Aws::String &uploadID,
const Aws::Vector<Aws::S3::Model::CompletedPart> &parts,
const Aws::S3::S3Client &client) {
Aws::S3::Model::CompletedMultipartUpload completedMultipartUpload;
completedMultipartUpload.SetParts(parts);
Aws::S3::Model::CompleteMultipartUploadRequest request;
request.SetBucket(bucket);
request.SetKey(key);
request.SetUploadId(uploadID);
request.SetMultipartUpload(completedMultipartUpload);
Aws::S3::Model::CompleteMultipartUploadOutcome outcome =
client.CompleteMultipartUpload(request);
if (!outcome.IsSuccess()) {
std::cerr << "Error completing multipart upload: " << outcome.GetError().GetMessage() << std::endl;
}
return outcome;
}
- CLI
-
- AWS CLI
-
The following command completes a multipart upload for the key multipart/01
in the bucket amzn-s3-demo-bucket
:
aws s3api complete-multipart-upload --multipart-upload file://mpustruct
--bucket amzn-s3-demo-bucket
--key 'multipart/01
' --upload-id dfRtDYU0WWCCcH43C3WFbkRONycyCpTJJvxu2i5GYkZljF.Yxwh6XG7WfS2vC4to6HiV6Yjlx.cph0gtNBtJ8P3URCSbB7rjxI5iEwVDmgaXZOGgkk5nVTW16HOQ5l0R
The upload ID required by this command is output by create-multipart-upload
and can also be retrieved with list-multipart-uploads
.
The multipart upload option in the above command takes a JSON structure that describes the parts of the multipart upload that should be reassembled into the complete file. In this example, the file://
prefix is used to load the JSON structure from a file in the local folder named mpustruct
.
mpustruct:
{
"Parts": [
{
"ETag": "e868e0f4719e394144ef36531ee6824c",
"PartNumber": 1
},
{
"ETag": "6bb2b12753d66fe86da4998aa33fffb0",
"PartNumber": 2
},
{
"ETag": "d0a0112e841abec9c9ec83406f0159c8",
"PartNumber": 3
}
]
}
The ETag value for each part is upload is output each time you upload a part using the upload-part
command and can also be retrieved by calling list-parts
or calculated by taking the MD5 checksum of each part.
Output:
{
"ETag": "\"3944a9f7a4faab7f78788ff6210f63f0-3\"",
"Bucket": "amzn-s3-demo-bucket",
"Location": "https://amzn-s3-demo-bucket.s3.amazonaws.com/multipart%2F01",
"Key": "multipart/01"
}
- Rust
-
- SDK for Rust
-
let completed_multipart_upload: CompletedMultipartUpload = CompletedMultipartUpload::builder()
.set_parts(Some(upload_parts))
.build();
let _complete_multipart_upload_res = client
.complete_multipart_upload()
.bucket(&bucket_name)
.key(&key)
.multipart_upload(completed_multipart_upload)
.upload_id(upload_id)
.send()
.await?;
let multipart_upload_res: CreateMultipartUploadOutput = client
.create_multipart_upload()
.bucket(&bucket_name)
.key(&key)
.send()
.await?;
let upload_id = multipart_upload_res.upload_id().ok_or(S3ExampleError::new(
"Missing upload_id after CreateMultipartUpload",
))?;
let mut upload_parts: Vec<aws_sdk_s3::types::CompletedPart> = Vec::new();
for chunk_index in 0..chunk_count {
let this_chunk = if chunk_count - 1 == chunk_index {
size_of_last_chunk
} else {
CHUNK_SIZE
};
let stream = ByteStream::read_from()
.path(path)
.offset(chunk_index * CHUNK_SIZE)
.length(Length::Exact(this_chunk))
.build()
.await
.unwrap();
let part_number = (chunk_index as i32) + 1;
let upload_part_res = client
.upload_part()
.key(&key)
.bucket(&bucket_name)
.upload_id(upload_id)
.body(stream)
.part_number(part_number)
.send()
.await?;
upload_parts.push(
CompletedPart::builder()
.e_tag(upload_part_res.e_tag.unwrap_or_default())
.part_number(part_number)
.build(),
);
}
For a complete list of AWS SDK developer guides and code examples, see
Developing with Amazon S3 using the AWS SDKs.
This topic also includes information about getting started and details about previous SDK versions.