Вопросы политики и подписи для формы Rails post для загрузки s3

Я пытаюсь следовать это "как-бы" (form POST to S3 bucket) и, похоже, сбой в моей политике и подписи.

Я не уверен, что моя политика и подписи не так? Но я знаю, что у меня проблема с оценкой методов, которые я создал в своем помощнике. Я попытался преобразовать значения политики и подписи в символы <%= :S3_UPLOAD_SIGNATURE %> и я пробовал

Я называл вспомогательные методы раньше без проблем, поэтому я немного потерянный.

ошибки:

NameError in Proj_files#new

Showing /app/views/proj_files/new.html.erb where line #8 raised:

uninitialized constant ActionView::CompiledTemplates::S3_UPLOAD_POLICY
Extracted source (around line #8):

5:       <input type="hidden" name="AWSAccessKeyId" value= <%= ENV['AWS_ACCESS_KEY_ID'] %> > 
6:       <input type="hidden" name="acl" value="private"> 
7:       <input type="hidden" name="success_action_redirect" value="http://localhost/">
8:       <input type="hidden" name="policy" value= <%= S3_UPLOAD_POLICY %> >
9:       <input type="hidden" name="signature" value= <%= S3_UPLOAD_SIGNATURE %> >
10:       <input type="hidden" name="Content-Type" value="image/png">
11:       <!-- Include any additional input fields here -->

у меня есть контроллер proj_files с соответствующим новым.формат html.Эрб:

<form action="https://s3.amazonaws.com/MY_BUCKET" method="post" enctype="multipart/form-data">
  <input type="hidden" name="key" value="uploads/${filename}">
  <input type="hidden" name="AWSAccessKeyId" value= <%= ENV['AWS_ACCESS_KEY_ID'] %> > 
  <input type="hidden" name="acl" value="private"> 
  <input type="hidden" name="success_action_redirect" value="http://localhost/">
  <input type="hidden" name="policy" value= <%= S3_UPLOAD_POLICY %> >
  <input type="hidden" name="signature" value= <%= S3_UPLOAD_SIGNATURE %> >
  <input type="hidden" name="Content-Type" value="image/png">
  <!-- Include any additional input fields here -->

  File to upload to S3: 
  <input name="file" type="file"> 
  <br> 
  <input type="submit" value="Upload File to S3"> 
</form> 

и proj_files_helper.rb:

module ProjFilesHelper

  def S3_UPLOAD_POLICY options = {}
    options[:content_type] ||= ''
    options[:acl] ||= 'private'
    options[:max_file_size] ||= 500.megabyte
    options[:path] ||= ''

    Base64.encode64(
      "{'expiration': '#{10.hours.from_now.utc.strftime('%Y-%m-%dT%H:%M:%S.000Z')}',
        'conditions': [
          {'bucket': '#{ENV['S3_BUCKET']}'},
          ['starts-with', '$key', ''],
          {'acl': '#{options[:acl]}'},
          {'success_action_status': '201'},
          ['content-length-range', 0, #{options[:max_file_size]}],
          ['starts-with','$Content-Type','']
        ]
    }").gsub(/n|r/, '')
  end


  def S3_UPLOAD_SIGNATURE options = {}
    Base64.encode64(
      OpenSSL::HMAC.digest(
      OpenSSL::Digest::Digest.new('sha1'),
      ENV['AWS_SECRET_ACCESS_KEY'], s3_policy(options))).gsub("n","")
  end

end

Спасибо, что посмотрели!

обновление: Я изменил имена методов на нижний регистр, и это привело меня немного дальше (я должен был понять это!).

теперь я получаю ошибку S3:

<Error>
<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Policy Condition failed: ["eq", "$bucket", "MY_BUCKETS_NAME"]
</Message>

кажется, что может быть переменная ENV $ bucket плохая ссылка, которую я буду искать... "MY_BUCKETS_NAME" отображало правильное имя ведра....Если кто-то может предложить любую помощь в получении формы rails post для S3 и запуска / указать на мои ошибки, я был бы признателен.

спасибо

обновление 2 В комментарии ниже я изменил свое действие формы на"https://s3.amazonaws.com/MY_BUCKET " и получил эту ошибку:

Invalid according to Policy: Policy Condition failed: ["eq", "$acl", "public-read"]

близко... Спасибо!

UPDATE3 Я сражаюсь!

Я изменил политику и форму ACL, чтобы иметь одинаковое согласованное значение (частное или публичное чтение).

комментарии ниже привели меня к изменению формы действий: http://MY_BUCKET.s3.amazonaws.com/ Я получаю эту ошибку:

<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Policy Condition failed: ["eq", "$success_action_status", "201"]
</Message>

как ни странно, когда я иду в консоль управления AWS S3 и загружаю файл в свое ведро, он говорит мне, что ссылка'http://s3.amazonaws.com/MY_BUCKET' форма. Я добавлен MY_BUCKET до и после amazonaws и все еще получил ту же ошибку...

Я не уверен, где происходит неправильная конфигурация... Я собираюсь создать новое ведро и посмотреть, правильно ли я настроен....

спасибо!

ТЕПЕРЬ РАБОТАЕТ!!! Я все исправил из ответа... но потом пришлось внести еще одно изменение...

моя форма имела поле "success_action_redirect", но моя политика имела success_action_status!

поля политики и формы должны совпадать! Да!

Спасибо за помощь... время, чтобы настроить его немного дальше!

2 ответов


1 / чтобы загрузить файл, вы должны использовать этот url "http://#{bucket_name}.s3.amazonaws.com/". Это четко указано в документация:

действие определяет URL-адрес, который будет обрабатывать запрос; это должно быть установлено в URL-адрес ведра. Например, если имя вашего ведра - "johnsmith", то URL-адрес будет"http://johnsmith.s3.amazonaws.com/"

2 / у вас должна быть последовательная политика, кажется, вы установили public-read в подписи и private в форма.


Я получал следующую ошибку: Недопустимый в соответствии с политикой: ошибка условия политики: [\"eq\", \"$bucket\"

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