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

Post 表单预签名(C++ SDK)

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

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

TOS 支持基于浏览器的 POST 上传对象请求,方便您将内容直接上传到 TOS。使用 POST 上传对象时,您需要在表单中增加签名信息。

包含基础参数的 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;

}

包含多个表单域的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);
    // 设置拼接到 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 表单预签名的详细信息,请参见基于浏览器上传的表单中包含签名