2012-12-26 14 views
7

मैं this "how-to" (एस 3 बाल्टी में फॉर्म पोस्ट) का पालन करने का प्रयास कर रहा हूं और मेरी नीति और हस्ताक्षर पर असफल होने लग रहा हूं।एस 3 अपलोड करने के लिए एक रेल पोस्ट फॉर्म के लिए नीति और हस्ताक्षर मुद्दे

मुझे यकीन नहीं है कि मेरी नीति और हस्ताक्षर गलत हैं? लेकिन मुझे पता है कि मुझे अपने सहायक में बनाए गए तरीकों का मूल्यांकन करने में कोई समस्या है। मैंने नीति & प्रतीकों को <%= :S3_UPLOAD_SIGNATURE %> पर हस्ताक्षर मानों को परिवर्तित करने का प्रयास किया है और मैंने <% = h, <% = कच्चे, "# {<% = ..}" की कोशिश की है।

मैंने बिना किसी समस्या के पहले सहायक तरीके कहा है, इसलिए मैं थोड़ा खो गया हूं।

त्रुटि:

<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 

के लिए धन्यवाद

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 नियंत्रक है ग़ौर करना!

अद्यतन: मैंने विधि नाम को कम मामले में बदल दिया और मुझे थोड़ा और आगे मिला (मुझे यह एहसास होना चाहिए था!)।

अब मैं एक S3 त्रुटि मिलती है:

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

लगता है जैसे वहाँ एक ENV चर $ बाल्टी बुरा संदर्भ मैं के लिए ... "MY_BUCKETS_NAME" गौर करेंगे उचित बाल्टी नाम प्रदर्शित किया हो सकता है ... यदि कोई भी एस 3 के लिए रेल पोस्ट फॉर्म प्राप्त करने और मेरी त्रुटियों को चलाने/इंगित करने पर कोई मदद दे सकता है तो मैं इसकी सराहना करता हूं।

धन्यवाद

UPDATE2 टिप्पणी प्रति नीचे मैं अपने प्रपत्र कार्रवाई संशोधित करने के लिए "https://s3.amazonaws.com/MY_BUCKET" और इस त्रुटि प्राप्त: हो रही करीब ... धन्यवाद

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

!

UPDATE3 मैं लड़ाई लड़ रहा हूं!

मैंने नीति संशोधित की है और एसीएल को एक ही संगत मूल्य (निजी या सार्वजनिक-पढ़ने) रखने के लिए बनाया है।

टिप्पणियाँ नीचे मेरे लिए प्रपत्र कार्रवाई को संशोधित करने के लिए प्रेरित किया:

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

अजीब तरह से पर्याप्त है जब मैं एडब्ल्यूएस S3 प्रबंधन कंसोल पर जाएं और मेरी बाल्टी में एक फ़ाइल अपलोड, यह मेरे लिंक बताता है: http://MY_BUCKET.s3.amazonaws.com/ मैं इस त्रुटि मिलती है `http://s3.amazonaws.com/MY_BUCKET 'फॉर्म का है। मैंने amazonaws से पहले और बाद में MY_BUCKET जोड़ा है और अभी भी एक ही त्रुटि प्राप्त हुई है ...

मुझे यकीन नहीं है कि गलत कॉन्फ़िगरेशन कहां हो रहा है ... मैं एक नई बाल्टी बनाने जा रहा हूं और देख रहा हूं कि मैं सेटअप करता हूं या नहीं गलत....

धन्यवाद!

आईटी अब काम करता है !!! मैंने जवाब से सबकुछ तय किया ... लेकिन फिर एक और परिवर्तन करना पड़ा ...

मेरे फॉर्म में "success_ सफलता_action_redirect" फ़ील्ड था लेकिन मेरी नीति में सफलता_action_status था!

नीति और फॉर्म फ़ील्ड का मिलान होना चाहिए! ओह!

सभी मदद के लिए धन्यवाद ... थोड़ा और आगे ट्विक करने का समय!

+0

मुझे लगता है कि आपका बाल्टी नाम नहीं है: MY_BUCKETS_NAME – apneadiving

+0

मैंने त्रुटि संदेश बाल्टी नाम संदर्भ को इसके साथ बदल दिया ... लेकिन त्रुटि ने मेरी उचित बाल्टी को संदर्भित किया। – twinturbotom

+0

क्या आपके पास यूआरएल में वही बाल्टी नाम है? 'https: // YOUR_BUCKET_NAME.s3.amazonaws.com /' – apneadiving

उत्तर

6

1/फ़ाइल अपलोड करने के लिए आपको इस यूआरएल "http://#{bucket_name}.s3.amazonaws.com/" का उपयोग करना होगा। यह स्पष्ट रूप से 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/आप सुसंगत नीति होनी चाहिए, आप हस्ताक्षर में public-read और रूप में private सेट लगता है।

1

मैं निम्न त्रुटि हो रही थी: नीति के अनुसार अमान्य: नीति स्थिति में विफल रहा है: [\ "eq \", \ "$ बाल्टी \"

कई घंटे के बाद, मुझे पता चला कि आप नहीं कर सकते हैं कि अपरकेस अक्षरों के साथ एक बाल्टी। बाल्टी को लोअरकेस में बदलना इसे ठीक करता है।

संबंधित मुद्दे