2012-12-26 16 views
7

Sto tentando di seguire this "how-to" (modulo POST su bucket S3) e sembra non essere in linea con la mia politica e firma.Problemi relativi alle norme e alle firme per un modulo di invio di rails al caricamento s3

Non sono sicuro che la mia politica e la firma siano sbagliate? Ma so che sto avendo un problema valutando i metodi che ho creato nel mio aiuto. Ho provato a convertire i valori della chiave & per i simboli <%= :S3_UPLOAD_SIGNATURE %> e ho provato <% = h, <% = raw, "# {<% = ..}".

Ho chiamato metodi di supporto prima senza problemi quindi sono un po 'perso.

l'errore:

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

Ho un controllore proj_files con una corrispondente 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> 

e 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 

Grazie per dare un'occhiata!

UPDATE: ho cambiato i nomi dei metodi per abbassare caso e che mi ha fatto un po 'più (avrei dovuto capire che!).

Ora ho un errore S3:

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

sembra che ci può essere un ENV $ secchio variabile di riferimento male cercherò ... "MY_BUCKETS_NAME" ha fatto visualizzare il nome proprio secchi ... .Se chiunque può offrire aiuto su come ottenere i bacheche inviare un modulo per S3 attivo e funzionante/indicare i miei errori, lo apprezzerei.

Grazie

UPDATE2 Per commento qui sotto ho modificato la mia azione sotto forma di "https://s3.amazonaws.com/MY_BUCKET" e ricevuto questo errore:

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

Avvicinarsi ... Grazie!

UPDATE3 Sto combattendo il combattimento!

Ho modificato la politica e forma ACL per avere lo stesso valore coerente (privato o pubblico).

Commenti qui sotto mi hanno portato a modificare i provvedimenti sotto forma di: http://MY_BUCKET.s3.amazonaws.com/ ottengo questo errore:

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

Stranamente quando vado a console di gestione AWS S3 e caricare un file al mio secchio, mi dice il link è del modulo `http://s3.amazonaws.com/MY_BUCKET '. Ho aggiunto MY_BUCKET prima e dopo amazonaws e stesso errore ancora ricevuto ...

non sono sicuro dove non mis-configurazione si sta verificando ... Ho intenzione di creare un nuovo secchio e vedere se ha installato sbagliato....

Grazie!

ORA FUNZIONA !!! Ho sistemato tutto dalla risposta ... ma poi ha dovuto fare un altro cambiamento ...

La mia forma aveva un campo "success_action_redirect", ma la mia politica ha avuto un success_action_status!

I campi della politica e del modulo devono corrispondere! DUH!

Grazie per tutto l'aiuto ... il tempo di modificarlo un po 'di più!

+0

Immagino che il nome del bucket non sia: MY_BUCKETS_NAME – apneadiving

+0

Ho sostituito l'errore msgs nome bucket nome con quello ... ma l'errore ha fatto riferimento al bucket corretto. – twinturbotom

+0

hai lo stesso nome del bucket nell'URL? 'https: // YOUR_BUCKET_NAME.s3.amazonaws.com /' – apneadiving

risposta

6

1/Per caricare il file è necessario utilizzare questo URL "http://#{bucket_name}.s3.amazonaws.com/". E 'chiaramente indicato nel 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/È necessario disporre di politica coerente, sembra si imposta public-read nella firma e private in forma.

1

stavo ottenendo il seguente errore: non valido in base alla politica: Condizione politica fallimentare:, \ "$ secchio \" [\ "eq \"

Dopo molte ore, ho imparato che non si può avere un secchio con lettere maiuscole. Cambiando il bucket in minuscolo è stato risolto.

Problemi correlati