7

この「ハウツー」(POSTからS3バケットへのフォーム)に従おうとしていますが、ポリシーと署名に失敗しているようです。

ポリシーと署名が間違っているかどうかわかりませんか?しかし、ヘルパーで作成したメソッドの評価に問題があることは知っています。ポリシーと署名の値をシンボルに変換してみました<%= :S3_UPLOAD_SIGNATURE %>。また、<%= h、<%= raw、 "#{<%=..}"を試しました。

以前は問題なくヘルパーメソッドを呼び出したので、少し迷っています。

エラー:

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

対応するnew.html.erbを持つproj_filesコントローラーがあります。

<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」は適切なバケット名を表示しました...誰かがS3へのレール投稿フォームを起動して実行するためのヘルプを提供できる場合/私の誤りを指摘していただければ幸いです。

ありがとう

UPDATE2 以下のコメントごとに、フォームアクションを「https://s3.amazonaws.com/MY_BUCKET」に変更し、次のエラーを受け取りました。

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

近づいています...ありがとう!

UPDATE3 私は戦いを戦っています!

ポリシーとフォームACLを変更して、同じ一貫した値(privateまたはpublic-read)を持つようにしました。

以下のコメントにより、フォームアクションを次のように変更すること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」形式であることがわかります。amazonawsの前後にMY_BUCKETを追加しましたが、それでも同じエラーが発生します...

設定ミスがどこで発生しているのかわかりません...新しいバケットを作成して、セットアップが間違っているかどうかを確認します...。

ありがとう!

それは今動作します!!! 私は答えからすべてを修正しました...しかし、それからもう1つの変更をしなければなりませんでした...

フォームには「success_action_redirect」フィールドがありましたが、ポリシーにはsuccess_action_statusがありました。

ポリシーフィールドとフォームフィールドは一致する必要があります。DUH!

すべての助けに感謝します...もう少しそれを微調整する時間!

4

2 に答える 2

6

1 /ファイルをアップロードするには、このURLを使用する必要があります"http://#{bucket_name}.s3.amazonaws.com/"ドキュメントに明確に記載されています:

アクションは、リクエストを処理するURLを定義します。これはバケットのURLに設定する必要があります。たとえば、バケットの名前が「johnsmith」の場合、URLは「http://johnsmith.s3.amazonaws.com/」になります。

2 /あなたは一貫した方針を持っている必要があります、あなたpublic-readは署名とprivateフォームで設定したようです。

于 2012-12-26T21:49:49.487 に答える
1

次のエラーが発生していました:ポリシーに従って無効:ポリシー条件が失敗しました:[\" eq \"、\ "$bucket \"

何時間も経って、大文字のバケツは持てないことを知りました。バケットを小文字に変更すると修正されました。

于 2013-06-07T16:47:18.453 に答える