Append upload (C++ SDK V2)

更新时间:
复制 MD 格式

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 as cn-hangzhou.

  • The sample code gets access credentials from environment variables.

  • To perform an append upload, you must have the oss:PutObject permission.

  • 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