AWS Golang SDK не может скопировать объект, если ключ содержит арабские символы - PullRequest
0 голосов
/ 03 апреля 2019

Используя aws-sdk-go , я смог успешно скопировать объекты в моем контейнере s3, когда ключ содержит обычные буквенно-цифровые символы и несколько специальных символов, таких как (-, _).Но когда ключ содержит арабский символ, golang aws-sdk выдает ошибку.

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

Ключ в корзине выглядит следующим образом:

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

Код также довольно прост:

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)
}

Я также распечатываю ключ, на всякий случай: dummy-bucket/public/10009/img__١٣٤١١١-1600x1200.jpg

Мне также удалось успешно загрузить изображениеиспользуя aws-sdk-go, с тем же ключом.

1 Ответ

2 голосов
/ 03 апреля 2019

Согласно документации, CopySource должен быть в кодировке URL.

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"`

Попробуйте это,

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)
}
...