我正在尝试在两个桶之间移动我的物体。
我执行一个 CopyRequest,然后执行一个 DeleteRequest。但是当我尝试复制对象时,出现以下错误:
Amazon.S3.AmazonS3Exception:未实现值为“COPY”的标头“x-amz-tagging-directive”
我尝试在创建
CopyObjectRequest
实例后删除标头,但没有名称相似的标头。另外,在创建 CopyObjectRequest
的新实例时,我没有看到任何配置。
using Amazon.S3;
using Amazon.S3.Model;
var client = new AmazonS3Client(config);
var request = new CopyObjectRequest
{
SourceBucket = originBucket,
SourceKey = fileIdString,
DestinationBucket = destinationBucket,
DestinationKey = fileIdString
};
await client.CopyObjectAsync(request);
// deleting object...
根据 CloudFlare 文档,仍然不支持
x-amz-tagging-directive
标头:
❌ x-amz-标记指令
CopyObject
API 本身并不严格需要 x-amz-tagging-directive
标头,因为 S3 内部默认为 COPY
;如果未发送标头,CloudFlare 可能会在幕后执行无操作。
.NET SDK 不提供省略此标头的方法。它总是为此标头设置一个值,以确定是否需要复制对象的标签。我检查过的其他 SDK,即 JS、Java、Python 也执行相同的操作。
你可以从源代码中看到这一点:
if (copyObjectRequest.IsSetTagSet())
{
request.Headers.Add(S3Constants.AmzHeaderTagging, AmazonS3Util.TagSetToQueryString(copyObjectRequest.TagSet));
request.Headers.Add(S3Constants.AmzHeaderTaggingDirective, TaggingDirective.REPLACE.Value);
}
else
{
request.Headers.Add(S3Constants.AmzHeaderTaggingDirective, TaggingDirective.COPY.Value);
}
不幸的是,在 CloudFlare 支持此标头之前,您需要手动执行
GetObject
然后 PutObject
才能复制对象。