AppendObject uploads a file by appending data in sequential writes. You can use the OSS C++ SDK V2 to perform append uploads and seal appendable objects.
Usage notes
-
Before you run the sample code, replace
<region>with a specific region, such ascn-hangzhou. -
The sample code gets access credentials from environment variables.
-
To perform an append upload, you must have the
oss:PutObjectpermission. -
The data appended in each request cannot exceed 5 GB.
-
AppendObject creates objects of the Appendable type.
Examples
Append upload
The following code performs an append upload by first writing "hello" and then appending " world".
#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
oss::OSSClient client(conf);
// First append upload. Set position to 0.
std::string data1 = "hello";
auto body1 = oss::RequestBody::fromString(data1);
auto outcome1 = client.appendObject(
oss::models::AppendObjectRequest()
.setBucket("examplebucket")
.setKey("exampledir/exampleobject.txt")
.setPosition(0)
.setBody(body1));
if (!outcome1.has_value()) {
auto& e = outcome1.error();
std::cerr << "First append upload failed"
<< ", code: " << e.getCode()
<< ", message: " << e.getMessage()
<< ", requestId: " << e.getRequestId() << std::endl;
return 1;
}
auto& result1 = outcome1.value();
int64_t nextPosition = result1.getNextAppendPosition();
std::cout << "First append upload succeeded"
<< ", nextAppendPosition: " << nextPosition
<< ", hashCrc64ecma: " << result1.getHashCrc64ecma() << std::endl;
// Second append upload. Use the nextAppendPosition returned by the previous call.
std::string data2 = " world";
auto body2 = oss::RequestBody::fromString(data2);
auto outcome2 = client.appendObject(
oss::models::AppendObjectRequest()
.setBucket("examplebucket")
.setKey("exampledir/exampleobject.txt")
.setPosition(nextPosition)
.setBody(body2));
if (!outcome2.has_value()) {
auto& e = outcome2.error();
std::cerr << "Second append upload failed"
<< ", code: " << e.getCode()
<< ", message: " << e.getMessage()
<< ", requestId: " << e.getRequestId() << std::endl;
return 1;
}
auto& result2 = outcome2.value();
std::cout << "Second append upload succeeded"
<< ", nextAppendPosition: " << result2.getNextAppendPosition()
<< ", hashCrc64ecma: " << result2.getHashCrc64ecma() << std::endl;
return 0;
}
Seal an appendable file
The following code seals an appendable file to prevent further append writes:
#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
oss::OSSClient client(conf);
auto outcome = client.sealAppendObject(
oss::models::SealAppendObjectRequest()
.setBucket("examplebucket")
.setKey("exampledir/exampleobject.txt"));
if (!outcome.has_value()) {
auto& e = outcome.error();
std::cerr << "Failed to seal the appendable file"
<< ", code: " << e.getCode()
<< ", message: " << e.getMessage()
<< ", requestId: " << e.getRequestId() << std::endl;
return 1;
}
auto& result = outcome.value();
std::cout << "Sealed the appendable file"
<< ", status: " << result.getStatusCode()
<< ", sealedTime: " << result.getSealedTime() << std::endl;
return 0;
}
References
-
See AppendObject.cpp for the complete sample code to perform an append upload.
-
See SealAppendObject.cpp for the complete sample code to seal an appendable file.