Presigned_url с post - метод не разрешен - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь использовать метод ExAws.S3.presign_url/5 в пакете ex_aws_s3.

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

(ответ, заголовки и URL1)

(ответ, заголовки и url2)

моя функция:

  def presign_post_url(bucket_name, file_name, file_type_extension) do                                            config = % 
     config = { region: "eu-west-1" }
     ex_s3_client = ExAws.Config.new(:s3, config)
     query_params = [
        { "Content-Type", "image/jpg"},                                                                               
        {'key', "profile-pictures/" <> file_name}                                                                     
        # { "content-length-range", "10\,10000000" }#max 10MB
     ]                                                                                                             
    presign_options = [virtual_host: false, query_params: query_params]                                                                                                                                                       

    ExAws.S3.presigned_url(ex_s3_client, :post, "profile-pictures", file_name, presign_options)                                                                                                                               
  end

, которая возвращает что-то вроде:

https://bucket-name.s3.amazonaws.com/profile-pictures/67641eaf-4e3e-4792-98da-8df533605cd2.jpg?Content-Type=image%2Fjpg&key=profile-pictures%2F67641eaf-4e3e-4792-98da-8df533605cd2.jpg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAXHBL256UAYWNNMAO%2F20200404%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200404T034332Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1fcb3ebd678ea2f26cee5709004914cb3c7bc057c7ba164cdba160eec999cbb1

Ошибка, которую я получаю - неважно, как я создаю URL с помощью bucket_name / путь к папке / difts3-url-структура, я всегда получаю:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>MethodNotAllowed</Code>
    <Message>The specified method is not allowed against this resource.</Message>
    <Method>POST</Method>
    <ResourceType>OBJECT</ResourceType>
    <RequestId>D0BA0AC513BE36D6</RequestId>
    <HostId>NyzdUPLDzHnbkHzWxxcLjdGXOXkpmGOUU1KFIAPJ+vpIPEq0WWyZEerGq1xySG26qzPfKUg7l/o=</HostId>
</Error>

Cors на ведро:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Я в тупике.

Также - это работает с PUT .. просто не POST. Я прочитал кое-что о том, что пост действительно перенаправлен на пут, но вам нужно иметь правильный URL.

2 вида URL на s3

https:/bucket_name.s3.amazonaws.coms/folder_where_file_is/file_nmae.jpg и затем вы передаете регион в config.

или

https://s3-eu-west-1.amazonaws.com/bucket_name/folder_where_file_is/file_nmae.jpg

Я показал это на скриншотах - все еще не работает.

1 Ответ

0 голосов
/ 04 апреля 2020

Вот URL, который вы используете (для ясности сокращен):

https://s3/folder/file_name.jpg?query

Restful API различает POST запросы создания новых ресурсов против PUT запросов обновление существующих ресурсов.

POST s предполагается сделать в папку . PUT s, напротив, выполняются для идентификатора ресурса .

Тем не менее, оба приведенных ниже будут правильными:

POST /folder/
PUT /folder/file_name.jpg

Ничто не является тем, что вы на самом деле проблема, которая является попыткой POST к resource id.

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

ExAws.S3.presigned_url(
  ex_s3_client,
  :post, 
  "profile-pictures",
  nil,
  presign_options
)

Возможно, объект должен быть самим объектом файла, я не уверен.

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