2012-12-26 15 views
7

Próbuję podążać za this "how-to" (z formularza POST do wiadra S3) i wygląda na to, że zawieruszyłem moją polisę i podpis.Problemy z polityką i podpisem dla formularza postu na szynach do przesyłania s3

Nie jestem pewien, czy moja polityka i podpis są błędne? Ale wiem, że mam problem z oceną metod, które stworzyłem w moim pomocniku. Próbowałem przekonwertować wartości sygnatury Policy & na symbole <%= :S3_UPLOAD_SIGNATURE %> i wypróbowałem <% = h, <% = raw, "# {<% = ..}".

Zadzwoniłem już do metod pomocniczych bez żadnych problemów, więc jestem trochę zagubiony.

błąd:

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

Mam kontroler proj_files z analogicznym new.html.erb:

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

i 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 

Dzięki za spojrzeć!

UPDATE: Zmieniłem nazwy metody na małe i że dostał mnie nieco dalej (mam sobie sprawę, że!).

Teraz pojawia się błąd S3:

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

Wydaje się, że może być zmienna $ ENV wiadro złe odniesienie będę szukać ... „MY_BUCKETS_NAME” nie wyświetla odpowiednią nazwę łyżki ... .Jeśli ktoś może zaoferować jakąkolwiek pomoc w uzyskaniu formularza postu na szynach do S3 i uruchomieniu/wskazaniu moich błędów, byłbym wdzięczny.

Dzięki

Update2 na komentarz poniżej zmodyfikowałem moje działanie formularz do "https://s3.amazonaws.com/MY_BUCKET" i pojawił się ten błąd:

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

zbliżają ... Dzięki!

UPDATE3 Walczę w walce!

Zmodyfikowałem zasady i utworzyłem listy ACL tak, aby miały taką samą stałą wartość (prywatne lub publiczne czytanie). poniżej

Komentarze doprowadziło mnie do modyfikacji formy działań mających na celu: http://MY_BUCKET.s3.amazonaws.com/ otrzymuję ten błąd:

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

Co dziwne, kiedy idę do konsoli zarządzania AWS S3 i przesłać plik do mojego wiadra, to mówi mi link jest z formularza "http://s3.amazonaws.com/MY_BUCKET". Dodałem MY_BUCKET przed i po amazonaws i nadal otrzymałem ten sam błąd ...

Nie jestem pewien, gdzie występuje błędna konfiguracja ... Zamierzam stworzyć nowe wiadro i sprawdzić, czy skonfigurowałem źle....

Dzięki!

TO DZIAŁA TERAZ !!! Naprawiłem wszystko od odpowiedzi ... ale potem musiałem wprowadzić jeszcze jedną zmianę ...

Moja forma miała pole "success_action_redirect", ale moja polisa osiągnęła sukces_action_status!

Pola zasad i formularzy muszą być zgodne! DUH!

Dziękuję za całą pomoc ... czas, aby poprawić nieco dalej!

+0

Przypuszczam, że nazwa Twojego zasobnika nie jest: MY_BUCKETS_NAME – apneadiving

+0

Zastąpiłam nazwę referencyjną wiadra o wiadkach o błędzie z tym ... ale błąd odwoływał się do mojego właściwego zasobnika. – twinturbotom

+0

Czy w adresie URL jest ta sama nazwa zasobnika? 'https: // YOUR_BUCKET_NAME.s3.amazonaws.com /' – apneadiving

Odpowiedz

6

1/Aby przesłać plik, należy użyć tego adresu URL: "http://#{bucket_name}.s3.amazonaws.com/". To wyraźnie stwierdzone w documentation:

The action defines the URL that will process the request; this must be set to the bucket's URL. For example, if your bucket's name is "johnsmith", then the URL would be " http://johnsmith.s3.amazonaws.com/ "

2/Musisz mieć spójną politykę, wydaje ustawić public-read w podpisie i private w formularzu.

1

ja otrzymuję następujący błąd: nieprawidłowa zgodnie z polityką: Stan Polityka failed: [\ „eq \”, \ „$ wiadro \”

Po wielu godzinach, dowiedziałem się, że nie można mieć wiadro z wielkimi literami. Zmiana na wiadro na małe oznaczało to.