You need to enable JavaScript to run this app.
导航
普通拷贝(C++ SDK)
最近更新时间:2024.02.04 18:30:56首次发布时间:2022.04.08 10:56:30

通过 copyObject 可以在同一地域的存储桶之间拷贝对象,也可以在同一个存储桶内拷贝对象。复制时可以设置指定新的元数据信息或保持源对象的元数据信息。

注意事项

  • 拷贝文件不支持跨区域的桶间拷贝。
  • 拷贝对象时,账号必须具备源对象的读取权限和目标桶的写入权限。
  • 拷贝对象时,可以保留所有元数据(默认值)或指定新的元数据。但 ACL 并未被保留,而是设置为私有。

示例代码

普通拷贝

对象小于 5GiB 时,您可以使用普通拷贝。以下代码用于将 srcbucket 桶中 srcdir/exampleobject.txt 对象拷贝到 destbucket 桶中,并设置对象名为 destdir/exampleobject.txt

#include "TosClientV2.h"
using namespace VolcengineTos;

int main(void){
    // 初始化 TOS 账号信息
    // Your Region 填写 Bucket 所在 Region
    std::string region = "Your Region";
    std::string accessKey = std::getenv("TOS_ACCESS_KEY");
    std::string secretKey = std::getenv("TOS_SECRET_KEY");
    // 填写 Bucket 名称,例如 destbucket
    std::string bucketName = "destbucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,destdir/exampleobject.txt。
    std::string objectName = "destdir/exampleobject.txt";
    // 填写 Bucket 名称,例如 srcbucket
    std::string srcBucketName = "srcbucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,srcdir/exampleobject.txt。
    std::string srcObjectName = "srcdir/exampleobject.txt";

    // 初始化网络等资源
    InitializeClient();
    // 创建交互的 client
    TosClientV2 client(region, accessKey, secretKey);

    CopyObjectV2Input input(bucketName, objectName, srcBucketName,srcObjectName);
    // 设置 ACL 为 PublicRead
    input.setAcl(ACLType::PublicRead);
    input.setStorageClass(StorageClassType::STANDARD);
    input.setMetadataDirective(MetadataDirectiveType::REPLACE);
     auto output = client.copyObject(input);
    if (!output.isSuccess()) {
        // 异常处理
        std::cout << "CopyObject failed." << output.error().String() << std::endl;
        // 释放网络等资源
        CloseClient();
        return -1;
    }

    std::cout << "CopyObject success. the object etag:" << output.result().getETag() << std::endl;

    // 释放网络等资源
    CloseClient();
    return 0;
}

拷贝时继承源对象元数据

#include "TosClientV2.h"
using namespace VolcengineTos;

int main(void){
    // 初始化 TOS 账号信息
    // Your Region 填写 Bucket 所在 Region
    std::string region = "Your Region";
    std::string accessKey = std::getenv("TOS_ACCESS_KEY");
    std::string secretKey = std::getenv("TOS_SECRET_KEY");
    // 填写 Bucket 名称,例如 destbucket
    std::string bucketName = "destbucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,destdir/exampleobject.txt。
    std::string objectName = "destdir/exampleobject.txt";
    // 填写 Bucket 名称,例如 srcbucket
    std::string srcBucketName = "srcbucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,srcdir/exampleobject.txt。
    std::string srcObjectName = "srcdir/exampleobject.txt";

    // 初始化网络等资源
    InitializeClient();
    // 创建交互的 client
    TosClientV2 client(region, accessKey, secretKey);
    // 默认行为为拷贝时继承对象元数据,如果需要显示设置,可设置参数 MetadataDirective
    CopyObjectV2Input input(bucketName, objectName, srcBucketName,srcObjectName);
    auto output = client.copyObject(input);
    if (!output.isSuccess()) {
        // 异常处理
        std::cout << "CopyObject failed." << output.error().String() << std::endl;
        // 释放网络等资源
        CloseClient();
        return -1;
    }

    std::cout << "CopyObject success. the object etag:" << output.result().getETag() << std::endl;

    // 释放网络等资源
    CloseClient();
    return 0;
}

拷贝时重写对象元数据

#include "TosClientV2.h"
using namespace VolcengineTos;

int main(void){
    // 初始化 TOS 账号信息
    // Your Region 填写 Bucket 所在 Region
    std::string region = "Your Region";
    std::string accessKey = std::getenv("TOS_ACCESS_KEY");
    std::string secretKey = std::getenv("TOS_SECRET_KEY");
    // 填写 Bucket 名称,例如 destbucket
    std::string bucketName = "destbucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,destdir/exampleobject.txt。
    std::string objectName = "destdir/exampleobject.txt";
    // 填写 Bucket 名称,例如 srcbucket
    std::string srcBucketName = "srcbucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,srcdir/exampleobject.txt。
    std::string srcObjectName = "srcdir/exampleobject.txt";
    
    // 初始化网络等资源
    InitializeClient();
    // 创建交互的 client
    TosClientV2 client(region, accessKey, secretKey);

    CopyObjectV2Input input(bucketName, objectName, srcBucketName,srcObjectName);
    // 通过设置 MetadataDirective 为 MetadataDirectiveType::REPLACE 实现重写对象元数据
    input.setMetadataDirective(MetadataDirectiveType::REPLACE);
    input.setMeta({{"self-test", "yes"}});
    auto output = client.copyObject(input);
    if (!output.isSuccess()) {
        // 异常处理
        std::cout << "CopyObject failed." << output.error().String() << std::endl;
        // 释放网络等资源
        CloseClient();
        return -1;
    }

    std::cout << "CopyObject success. the object etag:" << output.result().getETag() << std::endl;

    // 释放网络等资源
    CloseClient();
    return 0;
}

相关文档

关于普通拷贝的 API 文档,请参见 CopyObject