若您想在下载对象时,设置下载对象的限制条件(对象 ETag 或对象修改时间),您可使用 TOS C++ SDK 提供的限定条件下载功能,当对象信息满足您指定条件时才下载对象。本文介绍如何通过限定条件下载对象。
tos:GetObject
权限,具体操作,请参见权限配置指南。tos:GetObjectVersion
权限,具体操作,请参见权限配置指南。TOS 支持的限定条件如下。
参数 | 描述 |
---|---|
If-Match | 只有当传入的 |
If-Modified-Since | 只有在对象自指定时间以来被修改过时才返回该对象,否则返回304 Not Modified。时间格式为RFC1123 GMT。 |
If-None-Match | 只有当传入的 |
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。