0

我正在尝试使用预签名 URL 上传对象。但我想将对象与标签一起上传。正确的方法是什么?

方法一:

我尝试了以下红宝石代码:

signer = Aws::S3::Presigner.new
signer.presigned_url(:put_object, bucket: bucket_name, key: url, tagging: 'taggingName=tagValue')

但这只是上传对象,而不是添加标签。

方法二:

我尝试将“x-amz-tagging”标头列入白名单,并尝试从客户端上传文件以及标头。

红宝石代码:

signer = Aws::S3::Presigner.new
url = signer.presigned_url(:put_object, bucket: bucket_name, key: public_url, whitelist_headers: ['x-amz-tagging'])

客户端代码:

return $http({
      method: 'PUT',
      url: presigned_url,
      ignoreLoadingBar: true,
      data: file,
      headers: {
        'Content-Type': file.type,
        'x-amz-tagging': 'taggingName=tagValue'
      }
    })

但这在上传说“x-amz-tagging”未签名时给我一个错误。

我正在使用 aws-sdk-ruby v3 (Ror)

4

1 回答 1

2

根据文档

对象的标记集。标记集必须编码为 URL 查询参数。(例如,“Key1=Value1”)

错误似乎是在说同样的话

“x-amz-tagging”未签名。

因此,当您创建 URL 时,您需要提供具有相应值的标签类型。

    PUT /example-object HTTP/1.1
    Host: example-bucket.s3.<Region>.amazonaws.com   
    Accept: */*   
    Authorization:authorization string   
    Date: Thu, 22 Sep 2016 21:58:13 GMT   
    x-amz-tagging: tag1=value1&tag2=value2

    [... bytes of object data]   
     

同一文档页面上的示例 6。

无论您在创建签名 url 时提供了什么标签,您都可以从 url 中提取相同的标签并将它们传递给x-amz-tagging

就像是

     const tag = signS3URL.tag;
     ...
     const options = {
        url: signedUrl,
        path: fileUrl,
        method: "PUT",
        headers: { "Content-Type": file.mimeType, "X-Amz-Tagging": tag }
    };
  

虽然我不太擅长 JS。

最后但并非最不重要的一点是检查您的 cloudtrail 日志中是否存在标记对象的错误。

于 2021-01-13T12:34:07.967 回答