You need to enable JavaScript to run this app.
导航

列举分片上传任务(C++ SDK)

最近更新时间2024.02.04 18:31:04

首次发布时间2023.01.29 15:35:46

本文介绍列举分片上传任务的注意事项及示例代码。

注意事项

  • 要列举分片上传任务,您需要拥有对桶的 tos:ListBucketMultipartUploads 权限,具体操作请参见 IAM 策略概述
  • 此列举针对的是正在进行的、未合并分片的分片上传任务。如果某个分片上传任务已经合并分片,该任务将无法被列举到。

参数说明

参数

描述

delimiter

对对象名称进行分组的字符。

encodingType

对返回的内容进行编码并指定编码的类型。
默认值: None

maxUploads

返回分片上传任务的最大数量。默认为 1000。
取值:大于 0 小于等于 1000。

prefix

用于指定列举返回对象的前缀名称。

keyMarker

列举分片上传任务的起始位置。设定从该值之后按字母排序返回对象列表。通常为上次请求返回的 nextMarker 值。

uploadIdMarker

与 keyMarker 配合使用,设定从该值之后按字典排序返回分片上传任务列表。从上次列举结果中 nextVersionIdMarker 获取。

示例代码

简单列举未合并的分片任务

以下代码用于列举指定桶中 10 个未合并的分片上传任务。

#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 名称,例如 examplebucket
    std::string bucketName = "examplebucket";

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

    // 列举已上传分片,默认列举1000个分片
    ListMultipartUploadsV2Input input(bucketName);
    // 设置返回分片上传任务的最大数量
    input.setMaxUploads(10);
    auto output = client.listMultipartUploads(input);
    if (!output.isSuccess()) {
        // 异常处理
        std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
        // 释放网络等资源
        CloseClient();
        return -1;
    }
    std::cout << "ListMultipartUploads success." << std::endl;
    for (const auto& part : output.result().getUploads()) {
        std::cout << "part"<<
                ",key:" << part.getKey() <<
                ",uploadId:" << part.getUploadId() <<
                ",storageClasss:" << part.getStringFormatStorageClass() <<
                ",initiated time:" << part.getStringFormatInitiated() << 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 名称,例如 examplebucket
    std::string bucketName = "examplebucket";
    // 填写列举的文件前缀 Prefix。
    std::string prefix = "yourkeyPrefix";
    // 初始化网络等资源
    InitializeClient();
    // 创建交互的 client
    TosClientV2 client(region, accessKey, secretKey);
    // 列举已上传分片
    ListMultipartUploadsV2Input input(bucketName);
    // 设置列举前缀
    input.setPrefix(prefix);
    // 一次最多列举100条
    input.setMaxUploads(100);
    // isTruncated用于控制是否列举完全,nextKeyMarker用于递归列举
    bool isTruncated = true;
    std::string nextKeyMarker = "";
    while(isTruncated){
        input.setKeyMarker(nextKeyMarker);
        auto output = client.listMultipartUploads(input);
        if (!output.isSuccess()) {
            // 异常处理
            std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
            // 释放网络等资源
            CloseClient();
            return -1;
        }
        
        nextKeyMarker = output.result().getNextKeyMarker();
        isTruncated = output.result().isTruncated();

        std::cout << "ListMultipartUploads success." << std::endl;
        for (const auto& part : output.result().getUploads()) {
        std::cout << "part"<<
                ",key:" << part.getKey() <<
                ",uploadId:" << part.getUploadId() <<
                ",storageClasss:" << part.getStringFormatStorageClass() <<
                ",initiated time:" << part.getStringFormatInitiated() << 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 名称,例如 examplebucket
    std::string bucketName = "examplebucket";

    // 初始化网络等资源
    InitializeClient();
    // 创建交互的 client
    TosClientV2 client(region, accessKey, secretKey);
    // 列举已上传分片
    ListMultipartUploadsV2Input input(bucketName);
    // 一次最多列举100条
    input.setMaxUploads(100);
    // isTruncated用于控制是否列举完全,nextKeyMarker用于递归列举
    bool isTruncated = true;
    std::string nextKeyMarker = "";
    while(isTruncated){
        input.setKeyMarker(nextKeyMarker);
        auto output = client.listMultipartUploads(input);
        if (!output.isSuccess()) {
            // 异常处理
            std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
            // 释放网络等资源
            CloseClient();
            return -1;
        }

        nextKeyMarker = output.result().getNextKeyMarker();
        isTruncated = output.result().isTruncated();

        std::cout << "ListMultipartUploads success." << std::endl;
        for (const auto& part : output.result().getUploads()) {
            std::cout << "part"<<
                    ",key:" << part.getKey() <<
                    ",uploadId:" << part.getUploadId() <<
                    ",storageClasss:" << part.getStringFormatStorageClass() <<
                    ",initiated time:" << part.getStringFormatInitiated() << std::endl;
        }
    }

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

按目录递归列举未合并分片任务

TOS 只有对象的概念, 可通过创建一个大小为 0 并且以斜线 / 结尾的对象, 模拟目录的功能。
通过 delimiterprefix 两个参数可以模拟目录的功能:

  1. 首先设置 delimiter/ 同时设置 prefix 为空, 可返回根目录下的对象和子目录信息。
  2. 再设置 delimiter/ 同时设置 prefix 为子目录(subfiledir), 可返回子目录的对象和次级目录。

以下代码用于按目录递归列举桶 examplebucket 中未合并的分片上传任务。

#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 名称,例如 examplebucket
    std::string bucketName = "examplebucket";
    
    // 初始化网络等资源
    InitializeClient();
    // 创建交互的 client
    TosClientV2 client(region, accessKey, secretKey);

    // 列举已上传分片
    ListMultipartUploadsV2Input input(bucketName);
    // 设置分割符为"/"
    input.setDelimiter("/");
    // 一次最多列举100条
    input.setMaxUploads(100);
    auto output = client.listMultipartUploads(input);
    if (!output.isSuccess()) {
        // 异常处理
        std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
        // 释放网络等资源
        CloseClient();
        return -1;
    }

    std::cout << "ListMultipartUploads success." << std::endl;
    for (const auto& part : output.result().getUploads()) {
        std::cout << "part"<<
                ",key:" << part.getKey() <<
                ",uploadId:" << part.getUploadId() <<
                ",storageClasss:" << part.getStringFormatStorageClass() <<
                ",initiated time:" << part.getStringFormatInitiated() << std::endl;
    }
    for (const auto& prefix : output.result().getCommonPrefixes()) {
        std::cout << "Sub Dir:"<< prefix.getPrefix() << std::endl;
    }
    // 释放网络等资源
    CloseClient();
    return 0;
}

相关文档

关于列举对象分片的 API 文档,请参见 ListMultipartUploads