融合接口
功能說明
分片上傳步驟較多,包括初始化、文件切片、各個分片上傳、完成上傳。為了簡化分片上傳,可以使用TransferManager類的UploadFile接口進行分片上傳。
代碼示例
bool S3Demo::TranferUpload()
{
const Aws::String object_name = "<your-object-key>";
const Aws::String local_path = "<file-path>";
?
std::shared_ptr<Aws::Utils::Threading::PooledThreadExecutor> executor =
Aws::MakeShared<Aws::Utils::Threading::PooledThreadExecutor>("executor", 25);
Aws::Transfer::TransferManagerConfiguration transferConfig(executor.get());
transferConfig.s3Client = s3_client;
// 默認分片大小5MB
// transferConfig.bufferSize = Aws::Transfer::MB5;
// 設置公共讀
// transferConfig.putObjectTemplate.SetACL(Aws::S3::Model::ObjectCannedACL::public_read);
// transferConfig.createMultipartUploadTemplate.SetACL(Aws::S3::Model::ObjectCannedACL::public_read);
?
std::shared_ptr<Aws::Transfer::TransferHandle> requestPtr(nullptr);
?
transferConfig.downloadProgressCallback =
[](const Aws::Transfer::TransferManager*, const std::shared_ptr<const Aws::Transfer::TransferHandle>& handle)
{
std::cout << "\r" << "<AWS UPLOAD> Upload Progress: " <<
static_cast<int>(handle->GetBytesTransferred() * 100.0 / handle->GetBytesTotalSize()) << " Percent " <<
handle->GetBytesTransferred() << " bytes\n";
};
?
std::shared_ptr<Aws::Transfer::TransferManager> transferManager =
Aws::Transfer::TransferManager::Create(transferConfig);
?
Aws::String contentType = "binary/octet-stream";
Aws::Map<Aws::String, Aws::String> metadata;
requestPtr = transferManager->UploadFile(local_path, "<your-bucket-name>",
object_name, contentType, metadata);
requestPtr->WaitUntilFinished();
?
// Check status
if (requestPtr->GetStatus() == Aws::Transfer::TransferStatus::COMPLETED) {
if (requestPtr->GetBytesTotalSize() == requestPtr->GetBytesTransferred()) {
std::cout << "success" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
}
else {
std::cout << "failed" << std::endl;
}
return true;
}
請求參數
| 參數 | 意義 | 類型 | 是否必要 |
|---|
| local_path | 要上傳的本地文件 | string | 是 |
| bucket_name | 桶名 | string | 是 |
| object_name | 對象名 | string | 是 |
| contentType | http contentType頭 | string | 是 |
| metadata | 對象自定義元數據 | map<string, string> | 是,可以為空 |
注意:acl在TransferManagerConfiguration中設置
初始化分片上傳任務
功能說明
您可以使用CreateMultipartUpload接口創建上傳任務。
代碼示例
bool S3Demo::CreateMultipartUpload()
{
const Aws::String object_name = "<your-object-key>";
?
Aws::S3::Model::CreateMultipartUploadRequest request;
request.SetBucket("<your-bucket-name>");
request.SetKey(object_name);
?
Aws::S3::Model::CreateMultipartUploadOutcome outcome = s3_client->CreateMultipartUpload(request);
if (outcome.IsSuccess()) {
Aws::String uploadId = outcome.GetResult().GetUploadId();
std::cout << "CreateMultipartUpload " << object_name << ":" << uploadId << " success";
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: CreateMultipartUpload: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
返回結果
| 參數 | 類型 | 說明 |
|---|
| UploadId | string | 分片上傳任務的id |
上傳分片
功能說明
初始化分片上傳任務后,指定分片上傳任務的id可以上傳分片數據,可以將大文件分割成分片后上傳,除了最后一個分片,每個分片的數據大小為5MB~5GB,每個分片上傳任務最多上傳10000個分片。您可以使用UploadPart上傳分片。
代碼示例
bool S3Demo::UploadPart()
{
const Aws::String object_name = "<your-object-key>";
Aws::String upload_id = "<upload-id>";
std::shared_ptr<Aws::IOStream> input_data = Aws::MakeShared<Aws::StringStream>("MyStream");
*input_data << "<upload part content>";
int part_num = 1;
?
Aws::S3::Model::UploadPartRequest request;
request.SetBucket("<your-bucket-name>");
request.SetKey(object_name);
request.SetBody(input_data);
request.SetUploadId(upload_id);
request.SetPartNumber(part_num);
?
Aws::S3::Model::UploadPartOutcome outcome = s3_client->UploadPart(request);
if (outcome.IsSuccess()) {
std::cout << "UploadPart " << object_name << ":" << part_num << ":" << outcome.GetResult().GetETag() << " success";
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: UploadPart: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| Body | IOStream | 對象的數據 | 是 |
| PartNumber | int | 當前分片號碼 | 是 |
| UploadId | string | 通過創建上傳任務接口獲取到的任務Id | 是 |
返回結果
| 參數 | 類型 | 說明 |
|---|
| ETag | string | 本次上傳分片對應的Entity Tag |
合并分片
功能說明
合并指定分片上傳任務id對應任務中已上傳的對象分片,使之成為一個完整的文件。您可以使用CompleteMultipartUpload接口合并分片。
代碼示例
bool S3Demo::CompleteMultipartUpload()
{
const Aws::String object_name = "<your-object-key>";
Aws::String upload_id = "<upload-id>";
Aws::String eTag = "<part-etag>";
int part_num = 1;
?
Aws::S3::Model::CompletedMultipartUpload multiupload;
Aws::S3::Model::CompletedPart part;
part.SetETag(eTag);
part.SetPartNumber(part_num);
multiupload.AddParts(part);
?
Aws::S3::Model::CompleteMultipartUploadRequest request;
request.SetBucket("<your-bucket-name>");
request.SetKey(object_name);
request.SetUploadId(upload_id);
request.SetMultipartUpload(multiupload);
?
Aws::S3::Model::CompleteMultipartUploadOutcome outcome = s3_client->CompleteMultipartUpload(request);
if (outcome.IsSuccess()) {
std::cout << "CompleteMultipartUpload " << object_name << " success";
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: CompleteMultipartUpload: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| MultipartUpload | MultipartUpload | 包含了每個已上傳的分片的ETag和PartNUmber等信息 | 是 |
| UploadId | string | 通過創建上傳任務接口獲取到的任務Id | 是 |
返回結果
| 參數 | 類型 | 說明 |
|---|
| ETag | string | 本次上傳對象后對應的Entity Tag |
列舉分片上傳任務
功能說明
您可以使用ListMultipartUploads獲取未完成的上傳任務。
代碼示例
bool S3Demo::ListMultipartUploads()
{
const Aws::String object_name = "<your-object-key>";
?
Aws::S3::Model::ListMultipartUploadsRequest request;
request.SetBucket("<your-bucket-name>");
request.SetMaxUploads(50);
?
Aws::S3::Model::ListMultipartUploadsOutcome outcome = s3_client->ListMultipartUploads(request);
if (outcome.IsSuccess()) {
std::cout << "ListMultipartUploads " << object_name << " success" << std::endl;
Aws::Vector<Aws::S3::Model::MultipartUpload> uploads = outcome.GetResult().GetUploads();
for (Aws::S3::Model::MultipartUpload& upload : uploads) {
std::cout << upload.GetKey() << ":" << upload.GetUploadId() << std::endl;
}
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: ListMultipartUploads: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| MaxUploads | int | 用于指定獲取任務的最大數量(1-1000) | 否 |
返回結果
| 參數 | 類型 | 說明 |
|---|
| Uploads | Uploads | 包含了零個或多個已初始化的上傳分片信息的數組。數組中的每一項包含了分片初始化時間、分片上傳操作發起者、對象key、對象擁有者、存儲類型和UploadId等信息 |
列舉已上傳的分片
功能說明
您可以使用ListParts獲取一個未完成的上傳任務中已完成上傳的分片信息。
代碼示例
bool S3Demo::ListParts()
{
const Aws::String object_name = "<your-object-key>";
Aws::String upload_id = "<upload-id>";
?
Aws::S3::Model::ListPartsRequest request;
request.SetBucket("<your-bucket-name>");
request.SetKey(object_name);
request.SetUploadId(upload_id);
?
Aws::S3::Model::ListPartsOutcome outcome = s3_client->ListParts(request);
if (outcome.IsSuccess()) {
std::cout << "ListParts " << object_name << " success" << std::endl;
Aws::Vector<Aws::S3::Model::Part> parts = outcome.GetResult().GetParts();
for (Aws::S3::Model::Part& part : parts) {
std::cout << part.GetPartNumber() << ":" << part.GetETag() << std::endl;
}
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: ListParts: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| UploadId | string | 指定返回該任務id所屬的分片上傳的分片信息 | 是 |
返回結果
| 參數 | 類型 | 說明 |
|---|
| Parts | Parts | 包含了已上傳分片信息的數組,數組中的每一項包含了該分片的Entity tag、最后修改時間、PartNumber和大小等信息 |
復制分片
功能說明
復制分片操作可以從一個已存在的對象中拷貝指定分片的數據,當拷貝的對象大小超過5GB,必須使用復制分片操作完成對象的復制。除了最后一個分片外,每個拷貝分片的大小范圍是[5MB,5GB]。在拷貝一個大對象之前,需要使用初始化分片上傳操作獲取一個upload id,在完成拷貝操作之后,需要使用合并分片操作組裝已拷貝的分片成為一個對象。您可以使用UploadPartCopy復制一個分片。
代碼示例
bool S3Demo::UploadPartCopy()
{
const Aws::String bucket_source = "<source-bucket-name>";
const Aws::String bucket_dest = "<dst-bucket-name>";
const Aws::String object_source = "<source-object-key>";
const Aws::String object_dest = "<dst-object-key>";
?
Aws::String copy_source = bucket_source + "/" + object_source;
Aws::String upload_id = "<upload-id>";
Aws::String copy_source_range = "bytes=0-5242879";
int part_num = 1;
?
Aws::S3::Model::UploadPartCopyRequest request;
request.SetBucket(bucket_dest);
request.SetKey(object_dest);
request.SetCopySource(copy_source);
request.SetUploadId(upload_id);
request.SetPartNumber(part_num);
request.SetCopySourceRange(copy_source_range);
?
Aws::S3::Model::UploadPartCopyOutcome outcome = s3_client->UploadPartCopy(request);
if (outcome.IsSuccess()) {
std::cout << "UploadPartCopy " << object_dest << ":" << part_num << ":" << outcome.GetResult().GetCopyPartResult().GetETag() << " success";
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: UploadPartCopy: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| PartNumber | int | 當前分片號碼 | 是 |
| UploadId | string | 通過創建上傳任務接口獲取到的任務Id | 是 |
| CopySource | string | URL格式的拷貝對象數據來源,包含了桶名稱和對象key的信息,二者之間使用正斜杠(/)分割 | 是 |
| CopySourceRange | string | 指定本次分片拷貝的數據范圍,必須是"bytes=first-last"的格式,例如"bytes=0-9"表示拷貝原對象中前10字節的數據,只有當拷貝的分片大小大于5MB的時候有效 | 否 |
返回結果
| 參數 | 類型 | 說明 |
|---|
| CopyPartResult | CopyPartResult | 包含拷貝分片的Entity Tag和最后修改時間等信息 |
取消分片上傳任務
功能說明
您可以使用AbortMultipartUpload終止一個分片上傳任務。
代碼示例
bool S3Demo::AbortMultipartUpload()
{
const Aws::String object_name = "<your-object-key>";
Aws::String upload_id = "<upload-id>";
?
Aws::S3::Model::AbortMultipartUploadRequest request;
request.SetBucket("<your-bucket-name>");
request.SetKey(object_name);
request.SetUploadId(upload_id);
?
Aws::S3::Model::AbortMultipartUploadOutcome outcome = s3_client->AbortMultipartUpload(request);
if (outcome.IsSuccess()) {
std::cout << "AbortMultipartUpload " << object_name << " success";
return true;
} else {
Aws::S3::S3Error err = outcome.GetError();
std::cout << "Error: AbortMultipartUpload: " << (int)err.GetResponseCode() << ", Message:" <<
err.GetMessage() << std::endl;
return false;
}
}
請求參數
| 參數 | 類型 | 說明 | 是否必要 |
|---|
| Bucket | string | 桶名稱 | 是 |
| Key | string | 對象key | 是 |
| UploadId | string | 需要終止的上傳任務id | 是 |