代码之家  ›  专栏  ›  技术社区  ›  Delsx

Cloudflare R2在bucket之间移动对象不适用于S3 SDK

  •  0
  • Delsx  · 技术社区  · 2 年前

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

    我先执行CopyRequest,然后执行DeleteRequest。但是,当我试图复制对象时,会出现以下错误:

    亚马逊。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...
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Ermiya Eskandary    2 年前

    根据 CloudFlare docs 这个 x-amz-tagging-directive 标头仍然不受支持:

    x-amz-tagging-directive

    这个 CopyObject API本身没有 严格地 要求 x-amz-tagging-directive 头,因为S3内部默认为 COPY ;如果不发送标头,CloudFlare可能只是在幕后执行“不操作”。

    这个NET SDK不提供省略此标头的方法。它总是为此标头设置一个值,以确定是否需要复制对象的标记。我检查过的其他SDK,即JS、Java、Python也做同样的事情。

    你可以从中看到这一点 source code :

    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 以便复制对象。