twi*_*tom 7 upload post ruby-on-rails amazon-s3
我试图遵循这个"操作方法"(从POST到S3存储桶)并且似乎在我的策略和签名上失败了.
我不太确定我的政策和签名是错的吗?但我知道我在评估我在助手中创建的方法时遇到了问题.我已经尝试将Policy和签名值转换为符号<%= :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 -->
Run Code Online (Sandbox Code Playgroud)
我有一个proj_files控制器和相应的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>
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
谢谢参观!
更新: 我将方法名称更改为小写,这让我更进一步(我应该意识到这一点!).
现在我收到一个S3错误:
<Error>
<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Policy Condition failed: ["eq", "$bucket", "MY_BUCKETS_NAME"]
</Message>
Run Code Online (Sandbox Code Playgroud)
似乎可能有一个ENV变量$ bucket坏参考我会寻找..."MY_BUCKETS_NAME"确实显示了正确的桶名称....如果有人可以提供任何帮助获取rails post form到S3并运行/指出我的错误我很感激.
谢谢
UPDATE2 以下评论我将表单操作修改为" https://s3.amazonaws.com/MY_BUCKET "并收到此错误:
Invalid according to Policy: Policy Condition failed: ["eq", "$acl", "public-read"]
Run Code Online (Sandbox Code Playgroud)
越来越近了...谢谢!
UPDATE3 我正在打架!
我已经修改了策略并形成了ACL以具有相同的一致值(私有或公共读取).
下面的评论让我将表单操作修改为:http://MY_BUCKET.s3.amazonaws.com/我收到此错误:
<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Policy Condition failed: ["eq", "$success_action_status", "201"]
</Message>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我转到AWS S3管理控制台并将文件上传到我的存储桶时,它告诉我该链接是" http://s3.amazonaws.com/MY_BUCKET "表单.我在amazonaws之前和之后添加了MY_BUCKET,但仍然收到同样的错误......
我不确定发生错误配置的地方......我要创建一个新的存储桶,看看我是否设置错误....
谢谢!
它现在工作!!! 我从答案中解决了所有问题...但后来不得不再做一次改变......
我的表单有一个"success_action_redirect"字段,但我的策略有一个success_action_status!
政策和表单字段必须匹配!DUH!
感谢所有的帮助...时间进一步调整它!
1 /要上传文件,您必须使用此网址"http://#{bucket_name}.s3.amazonaws.com/".它在文档中明确说明:
该操作定义将处理请求的URL; 必须将其设置为存储桶的URL.例如,如果您的桶的名称是"johnsmith",那么URL将是" http://johnsmith.s3.amazonaws.com/ "
2 /您必须具有一致的策略,似乎您public-read在签名和private表单中设置.
| 归档时间: |
|
| 查看次数: |
8376 次 |
| 最近记录: |