in sample/src/object/ObjectSample.cc [544:593]
void ObjectSample::MultipartUploadObject()
{
std::string key = "MultipartUploadObject";
InitiateMultipartUploadRequest initUploadRequest(bucket_, key);
auto uploadIdResult = client->InitiateMultipartUpload(initUploadRequest);
auto uploadId = uploadIdResult.result().UploadId();
std::string fileToUpload = Config::BigFileToUpload;
int64_t partSize = 100 * 1024;
PartList partETagList;
auto fileSize = getFileSize(fileToUpload);
int partCount = static_cast<int>(fileSize / partSize);
// Calculate how many parts to be divided
if (fileSize % partSize != 0) {
partCount++;
}
// Upload multiparts to bucket
for (int i = 1; i <= partCount; i++) {
auto skipBytes = partSize * (i - 1);
auto size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary);
content->seekg(skipBytes, std::ios::beg);
UploadPartRequest uploadPartRequest(bucket_, key, content);
uploadPartRequest.setContentLength(size);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setPartNumber(i);
auto uploadPartOutcome = client->UploadPart(uploadPartRequest);
if (uploadPartOutcome.isSuccess()) {
Part part(i, uploadPartOutcome.result().ETag());
partETagList.push_back(part);
}
else {
PrintError(__FUNCTION__, uploadPartOutcome.error());
}
}
// Complete to upload multiparts
CompleteMultipartUploadRequest request(bucket_, key);
request.setUploadId(uploadId);
request.setPartList(partETagList);
auto outcome = client->CompleteMultipartUpload(request);
if (outcome.isSuccess()) {
std::cout << __FUNCTION__ << " success, UploadID : " << uploadId << std::endl;
}
else {
PrintError(__FUNCTION__, outcome.error());
}
}