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

限定条件下载(C++ SDK)

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

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

若您想在下载对象时,设置下载对象的限制条件(对象 ETag 或对象修改时间),您可使用 TOS C++ SDK 提供的限定条件下载功能,当对象信息满足您指定条件时才下载对象。本文介绍如何通过限定条件下载对象。

注意事项

  • 下载对象前,您必须具有 tos:GetObject 权限,具体操作,请参见权限配置指南
  • 对于开启多版本的桶,下载指定版本对象时,您必须具有 tos:GetObjectVersion 权限,具体操作,请参见权限配置指南
  • 如果应用程序会在同一时刻大量下载同一个对象,您的访问速度会受到 TOS 带宽及地域的限制。建议您使用 CDN 产品,提升性能的同时也能降低您的成本。通过 CDN 访问 TOS 的详细信息,请参见使用 CDN 加速访问 TOS 资源

限定条件说明

TOS 支持的限定条件如下。

参数

描述

If-Match

只有当传入的ETag与对象的 ETag相等才返回对象,否则返回412 Precondition Failed。

If-Modified-Since

只有在对象自指定时间以来被修改过时才返回该对象,否则返回304 Not Modified。时间格式为RFC1123 GMT。

If-None-Match

只有当传入的ETag与对象的 ETag不相等才返回对象,否则返回304 Not Modified。

If-Unmodified-Since

只有在对象自指定时间以来未被修改过时才返回该对象,否则返回412 Precondition Failed。时间格式为 RFC1123 GMT。

示例代码

以下代码用于限定条件下载桶 examplebucket 中的对象 exampledir/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 名称,例如 examplebucket
    std::string bucketName = "examplebucket";
    // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
    std::string objectName = "exampledir/exampleobject.txt";

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

    GetObjectV2Input input(bucketName, objectName);
    // 如果指定的时间早于实际修改时间,则正常传输文件,否则返回错误(304 Not modified)。86400 对应一天
    input.setIfModifiedSince(time(nullptr)-86400);
    // 如果指定的时间等于或者晚于文件实际修改时间,则正常传输文件,否则返回错误(412 Precondition failed)。
    input.setIfUnmodifiedSince(time(nullptr));
    // 如果指定的ETag和Tos文件的ETag匹配,以文件的etag为8a36be0d764367db4eea2deb16b71543举例,则正常传输文件,否则返回错误(412 Precondition failed)。
    // 通过 headObject 获取对象的 ETag,然后设置给 GetObjectV2Input 类型的 input
    HeadObjectV2Input headInput(bucketName,objectName);
    auto headOutput = client.headObject(headInput);
    auto etag = headOutput.result().getETag();
    input.setIfMatch(etag);
    // 如果指定的ETag和Tos文件的ETag不匹配,则正常传输文件,否则返回错误(304 Not modified)。
    // input.setIfNoneMatch(etag)

    auto output = client.getObject(input);
    if (!output.isSuccess()) {
        // 异常处理
        std::cout << "GetObject failed." << output.error().String() << std::endl;
        if (output.error().getStatusCode() == 304){
            std::cout << "StatusCode: 304" << output.error().String() << std::endl;
        }
        if (output.error().getStatusCode() == 412){
            std::cout << "StatusCode: 412" << output.error().String() << std::endl;
        }
        // 释放网络等资源
        CloseClient();
        return -1;
    }
    std::cout << "GetObject success. the object etag:" << output.result().getETags()  << std::endl;
    // 释放网络等资源
    CloseClient();
    return 0;
}

相关文档

关于下载对象的 API 文档,请参见 GetObject