TOS 支持基于浏览器的 POST 上传对象请求,方便您将内容直接上传到 TOS。使用 POST 上传对象时,您需要在表单中增加签名信息。
以下代码用于只包含基础参数的 POST 表单预签名上传对象。
#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); // 设置 Post 表单中签名有效时间,单位:秒 int64_t expires = 86400; // 生成 Post 上传预签名 PreSignedPostSignatureInput input(bucketName,objectName, expires); auto output = client.preSignedPostSignature(input); if(!output.isSuccess()){ // 异常处理 std::cout << "GeneratePreSignedUrl failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } auto res = output.result(); std::cout << "GeneratePreSignedUrl Success:" << "\n" << "Policy: " << res.getPolicy() << "\n" << "Algorithm: " << res.getAlgorithm() << "\n" << "Credential: " << res.getCredential() << "\n" << "Date: " << res.getDate() << "\n" << "OriginPolicy: " << res.getOriginPolicy() << "\n" << "Signature: " << res.getSignature() << "\n"; // 释放网络等资源 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"; // 填写 Object 完整路径,完整路径中请不要包含 Bucket 的名称,例如 exampledir/exampleobject.txt 对象 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 设置 Post 表单中签名有效时间,单位:秒 int64_t expires = 86400; // 生成 Post 上传预签名 PreSignedPostSignatureInput input(bucketName,objectName, expires); // 设置拼接到 policy 中的条件组 conditions,以 x-tos-acl 和 key 为例 input.setConditions( {PostSignatureCondition("x-tos-acl", "public-read"), PostSignatureCondition("key", "sdktest", std::make_shared<std::string>("starts-with"))}); // 设置拼接到 policy 中的条件组 conditions 中的 content-length-range 字段 input.setContentLengthRange(std::make_shared<ContentLengthRange>(50, 1025)); auto output = client.preSignedPostSignature(input); if(!output.isSuccess()){ // 异常处理 std::cout << "GeneratePreSignedUrl failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } auto res = output.result(); std::cout << "GeneratePreSignedUrl Success:" << "\n" << "Policy: " << res.getPolicy() << "\n" << "Algorithm: " << res.getAlgorithm() << "\n" << "Credential: " << res.getCredential() << "\n" << "Date: " << res.getDate() << "\n" << "OriginPolicy: " << res.getOriginPolicy() << "\n" << "Signature: " << res.getSignature() << "\n"; // 释放网络等资源 CloseClient(); return 0; }
关于 POST 表单预签名的详细信息,请参见基于浏览器上传的表单中包含签名。