融合接口
功能说明
分片上传步骤较多,包括初始化、文件切片、各个分片上传、完成上传。为了简化分片上传,可以使用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 | 是 |