2012-12-26 11 views
7

this "how-to" (POST - S3 bucket formunu) takip etmeye çalışıyorum ve politikamda ve imzamda başarısız oluyor gibi görünüyor.Bir ray için ilke ve imza sorunları s3'e yükleme formu gönderiliyor

Politikam ve imzam yanlış olduğundan emin değilim? Ama biliyorum, yardımcımda yarattığım yöntemleri değerlendirirken bir sorun yaşıyorum. İlke & imza değerlerini <%= :S3_UPLOAD_SIGNATURE %> simgelerine dönüştürmeyi denedim ve <% = h, <% raw = "{<% = ..}" denedim.

Hiç yardım almadan önce yardımcı yöntemler denedim, bu yüzden biraz kayboldum.

hatası:

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

ve 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 

Teşekkür

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

bir proj_files karşılık gelen bir new.html.erb ile denetleyiciniz göz atmak!

GÜNCELLEME: Ben küçük harfe yöntem adları değişti ve o (ben fark olmalı!) Biraz daha ileri beni.

Şimdi bir S3 hata alıyorum: i doğru kovalar adını görüntülemek yaptığı için ... "MY_BUCKETS_NAME" bakacağız bir ENV değişken $ kova kötü referans olabilir gibi

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

görünüyor ... .Kimseyi almak için herhangi bir yardım sunabilirse, S3'e form gönderme ve hata yapma/hata yapma konusunda teşekkür ederim.

Teşekkür

benim form eylemi modifiye etmek " https://s3.amazonaws.com/MY_BUCKET" ve bu hata aldı aşağıda Başına yorum

Update2 : yakın ... Teşekkür Alma

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

!

UPDATE3 Dövüşle savaşıyorum!

Politikayı değiştirdim ve ACL'yi aynı tutarlı değere (özel veya genel okuma) sahip olacak şekilde oluşturdum.

Ben AWS S3 yönetim konsoluna gidip kovaya bir dosyayı karşıya olduğunda Garibi
<Code>AccessDenied</Code> 
<Message> 
Invalid according to Policy: Policy Condition failed: ["eq", "$success_action_status", "201"] 
</Message> 

, bana bağlantıyı anlatır: bu hatayı alıyorum http://MY_BUCKET.s3.amazonaws.com/:

Yorumlar aşağıda form eylemi değiştirerek götürdü http://s3.amazonaws.com/MY_BUCKET formudur. MY_BUCKET önce ve sonra amazonaws ekledim ve hala aynı hata aldı ...

Yanlış yapılandırma nerede meydana geldiğinden emin değilim ... Yeni bir kepçe oluşturacağım ve ayarlayıp ayarlamadığımı göreceğim yanlış....

Teşekkürler!

ŞİMDİ ÇALIŞIYOR! Her şeyi yanıtladım ... ama bir değişiklik daha yapmam gerekiyordu ...

Formumun bir "success_action_redirect" alanı vardı ancak politikam bir success_action_status'a sahipti!

İlke ve form alanları eşleşmelidir! YAA!

Yardımlarınız için teşekkürler ... biraz daha zaman ayırma zamanı!

+0

Kepçe adınız sanırım: MY_BUCKETS_NAME – apneadiving

+0

Hata msgs bucket name referansını bununla değiştirdim ... ancak hata, uygun paketime başvurdu. – twinturbotom

+0

URL'de aynı kova adı var mı? https: // YOUR_BUCKET_NAME.s3.amazonaws.com/' – apneadiving

cevap

6

1/Dosyayı yüklemek için bu url'yi kullanmalısınız "http://#{bucket_name}.s3.amazonaws.com/". Açıkça documentation de belirtildiği:

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

/Tutarlı politikası olması gerekmektedir imzanızda public-read ve formda private set görünüyor.

1

aşağıdaki hatayı başlamıştı: Politikadan göre Geçersiz: İlke Durumu başarısız oldu: [\ "eq \", \ "$ kova \" Birçok saat sonra

, sana sahip olamayacağını öğrendik Büyük harflerle bir kova. Kepçeyi küçük harfle değiştirmek onu sabitledi.