为什么 CloudFlare R2 的 CopyObject 不能与适用于 .NET 的 AWS 开发工具包配合使用?

问题描述 投票:0回答:1

我正在尝试在两个桶之间移动我的物体。

我执行一个 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...
amazon-web-services amazon-s3 cloudflare aws-sdk-net cloudflare-r2
1个回答
1
投票

根据 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
才能复制对象。

© www.soinside.com 2019 - 2024. All rights reserved.