Загрузка изображения через предварительно подписанный URL-адрес S3.При загрузке изображения оно не доступно.Установка Content-Type делает недействительной подпись - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь загрузить изображения на S3 прямо из браузера, используя предварительно подписанный URL.У меня все работает, файл загружается в том месте, где я его ожидаю.

Моя проблема в том, что при загрузке изображения с S3 я не могу открыть его на своем Mac (ошибка в нераспознанном формате илиповрежденный файл).Это просто обычный jpg-файл.

У меня есть Lambda, настроенная на AWS, предоставляемая через API-шлюз, который генерирует для меня предварительно подписанный URL.Лямбда написана на Go (это мой первый проект, знакомый с Go).

На фронтэнде я использую Axios для загрузки изображения - ничего сложного с точки зрения других.Работает нормально, кроме упомянутой выше проблемы.Файл загружен с тем же объемом данных, что и локально (поэтому файл не пустой).

Я пытался применить Content-Type к image/jpeg при создании предварительно подписанного URL, ноэто лишает меня возможности загружать вообще, как говорится

The request signature we calculated does not match the signature you provided. Check your key and signing method.

Из того, что я вижу в возвращенной ошибке (см. ниже), тип содержимогоон получает multipart/form-data, но я не уверен, как типы контента работают с многокомпонентными отправками форм.

Это код Go в Lambda, который генерирует предварительно подписанный URL (включая тип контента):

// filename - <uuid>.jpg
// filetype - "image/jpeg"
req, _ := svc.PutObjectRequest(&s3.PutObjectInput{
  Bucket:      aws.String("facial-api"),
  Key:         aws.String(filename),
  ContentType: aws.String(filetype),
})

Запрос на загрузку из браузера:

// get file data
const file = fileInput && fileInput.files && fileInput.files[0] || null;

// create form data
const formData = new FormData();
formData.append("file", file);

// put request
axios.put(this.uploadURL, formData)
.then(res => {
  console.log(res)
})

Ошибка, которую я получаю:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
   <Code>SignatureDoesNotMatch</Code>
   <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
   <AWSAccessKeyId>ABC123</AWSAccessKeyId>
   <StringToSign>AWS4-HMAC-SHA256
20190531T111729Z
20190531/eu-west-1/s3/aws4_request
69c2673b27fde3743fc3ce426e959bc152f49f140650e5cfce4017ee13275524</StringToSign>
   <SignatureProvided>9745749ff83b1591fc7ee08d2796d7151d5952e7c4ada738c058db347d0791f5</SignatureProvided>
   <StringToSignBytes>41 57 53 34 2d....</StringToSignBytes>
   <CanonicalRequest>PUT
/328733de-bf61-4e85-8978-851e5b6021f6.jpg
X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=ASIA6E6TKZI66G23KCVJ%2F20190531%2Feu-west-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20190531T111729Z&amp;X-Amz-Expires=900&amp;X-Amz-Security-Token=AgoJb3JpZ2luX2VjEHMaCWV1LXdlc3QtMSJIMEYCIQCtRrALimM9jMPuJGgwP3xQFq2bXUxdfw0cW%2F09llPDNgIhAIBMmj2pXxlp%2Br2EkPEjUKJxaFieNtwcP9IdHEVwxnrnKp0CCIz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMOTcyNzE2NDI3ODM3Igwb5R%2FR4XFjwVhmkm4q8QGVCt%2Bocco26F3ZHuDya%2BTA%2BSa442QRixv0NBrhZH76cktkLtUE7t%2Baq6NzDUTGodXC4Ta8qvY%2BJ6RHaOzH1eGGFC9R%2FSD3uTGfqdUiipBkC2Fbw1VzdNNOvqVIX8qli0%2Bja08vDcZBCOLys%2BE7emCnNNMy8%2FZZnAXpA4V1pM9XKhjwmZqjrA%2BVAcYwpodcrUXfyEb7fZ6J%2B1IEoVsPuRgSomcQcMNiG5aTRJ5F7TCMDDU9T0%2F%2B2OObe7rDNgMTeG3WJOBDuq5GZdXj5YeZNkbGT2e6gf0UI64jpV%2FBIy685L7oOsxjWtnWP5sQ9ehDQV4KMLeUxOcFOrMBHfJ5mOrCedP35Fak9C5ufeVDYhdg%2Fyf4pqQRB4iUR8WVEwHPhGrZgWseWm4F6h7%2FJi%2F96HprpZdP1i22cH6WdV%2B6zBEWLUxrMLJrp8TbNWqCxRX0nBK8SU9CAInioFUTXtLtTtCU8VLtMWcSz8H5G2lS0RBWRulnKApPhXKjgasbDW%2FNyAbz1lYHfoK%2FwYixNxxNu5KPR8W8Tcgkd77iI6sv5kBauPg8cPNEgtRgwTMcER8%3D&amp;X-Amz-SignedHeaders=content-type%3Bhost
content-type:multipart/form-data; boundary=----WebKitFormBoundarytvKIVaU0MCOgbXT7
host:facial-api.s3.eu-west-1.amazonaws.com

content-type;host
UNSIGNED-PAYLOAD</CanonicalRequest>
   <CanonicalRequestBytes>50 55 54 0a 2f 33 32 38 37 33...</CanonicalRequestBytes>
   <RequestId>601F19984870DFAC</RequestId>
<HostId>XuSYqxIKEzD7XpDliU9kIGnsW8sIQzS4okXqDIuVVwB3Az+V276x2no47eDcY4OG+xQ3mh1yQeA=</HostId>
</Error>

Эта ошибка появляется только при определении Content-Typeпри генерации URL.Я ожидаю, что это загрузит мое изображение и позволит мне загрузить его в формате, который я могу использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...