douyunjiaok300404 2019-04-03 04:20
浏览 89
已采纳

当密钥包含阿拉伯字符时,AWS Golang SDK无法复制对象

Using aws-sdk-go, I have been able to sucessfully copy the objects in my s3 bucket when the key contains normal alphanumeric and few special characters like (-,_). But when a key contains an arabic character, the golang aws-sdk throws an error.

NoSuchKey: The specified key does not exist.
    status code: 404, request id: 438DC6xxxxxx, host id: Xp+xxxxxxxxxx

The key in the bucket looks like this:

public/10009/img__١٣٤١١١-1600x1200.jpg

The code is pretty straigh-forward as well:

func copyObject(existingKey, key string, svc *s3.S3) {
    copyObjectInput := &s3.CopyObjectInput{
        Bucket:     aws.String("dummy-bucket"),
        CopySource: aws.String(existingKey),
        Key:        aws.String(key),
    }

    result, err := svc.CopyObject(copyObjectInput)
    if err != nil {
        log.Fatal("Copy failed due to: ", err) // logs the above error here
    }

    spew.Dump(result)
}

I am also printing out the key, just in case: dummy-bucket/public/10009/img__١٣٤١١١-1600x1200.jpg

I was also able to successfully downloaded the image using the aws-sdk-go, with the same key.

  • 写回答

1条回答 默认 最新

  • douzuan5365 2019-04-03 05:59
    关注

    According to the documentation, CopySource must be URL-encoded.

    https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#CopyObjectInput

    // The name of the source bucket and key name of the source object, separated
    // by a slash (/). Must be URL-encoded.
    //
    // CopySource is a required field
    CopySource *string `location:"header" locationName:"x-amz-copy-source" type:"string" required:"true"`
    

    Try this,

    import "net/url"
    
    func copyObject(existingKey, key string, svc *s3.S3) {
    
        // existingKey is source bucket and key name separated by "/"
        e := url.QueryEscape(existingKey)
    
        copyObjectInput := &s3.CopyObjectInput{
            Bucket:     aws.String("dummy-bucket"),
            CopySource: aws.String(e),
            Key:        aws.String(key),
        }
    
        result, err := svc.CopyObject(copyObjectInput)
        if err != nil {
            log.Fatal("Copy failed due to: ", err) // logs the above error here
        }
    
        spew.Dump(result)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c