我尝试了很多不同的方法来使用环境变量设置S3进行图像上传,但无法使其正常工作。 我知道我的密钥和存储桶名称有效,因为当我直接将它们放入代码中时,我的图像可以正确上传。 但是,当我尝试切换到环境变量时,事情就不起作用了。
我使用了figaro gem创建了application.yml文件。 在该文件中,我有:
S3_BUCKET_NAME "xxxxx"
AWS_ACCESS_KEY_ID: "AAAAAAAAA"
AWS_SECRET_ACCESS_KEY: "BBBbbbBBBB"
我不确定是否应该有引号,但现在我已经加上了。我也尝试了不加引号的方式。
在我的模型(listing.rb)中,我有:
has_attached_file :image,
:styles => { :medium => "200x" , :thumb => "100x100" },
:default_url => "default.png",
:storage => :s3,
:s3_credentials => Proc.new{|a| a.instance.s3_credentials }
def s3_credentials
{:bucket => ENV["S3_BUCKET_NAME"], :access_key_id => ENV["AWS_ACCESS_KEY_ID"],
:secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
end
就像我说的那样,当我在def s3_credentials中硬编码值时,一切正常。但是当我尝试替换环境变量时,一切都崩溃了。
在paperclip.rb中,我有:
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com'
我还在production.rb和development.rb文件中添加了这段代码:
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => ENV['S3_BUCKET_NAME'],
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}
这是我上传新图片时收到的错误消息: "我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。" 在代码行上:"if @listing.save"。那些使用硬编码凭证上传的仍然可以在我的应用程序中看到。
我对 Rails 还比较陌生,已经在这里和其他地方搜索过,包括 S3 和 paperclip 文档,但找不到可行的解决方案。如果您需要查看其他代码,请告诉我。我打算部署到 Heroku,如果有关系的话,我看到 figaro 应该能够很好地与 Heroku 协作。谢谢。
编辑/更新:对于未来阅读此内容的其他人,Sachin 下面的答案起作用了。但是,我的一个密钥 ID 中有一个 '+'。尝试通过命令行添加环境变量时,所有字符都被截断了。只需将它们包装在""中,您就可以继续了。
此外,我放弃使用 figaro gem,并设置了一个 aws.rb 初始化文件(根据 Amazon 的说明)。以下是该文件的内容:
AWS.config(
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
)
S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET']]
我不确定这是否有任何影响,但是我的development.rb和production.rb文件现在具有以下作为paperclip默认值:
config.paperclip_defaults = {
:storage => :s3,
:bucket => "your_real_bucket_name_here_in_quotes",
:s3_credentials => {
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}
请注意将ENV存储桶名称的引用更改为S3_BUCKET而不是S3_BUCKET_NAME。
我的模型中(listing.rb)的代码现在是这样的:
has_attached_file :image, :styles => { :medium => "200x", :thumb "100x100"}, :default_url => "default.png", :storage => :s3, :bucket => "your_real_bucket_name_here_in_quotes"
validates_attachment_content_type :image, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]