麻烦设置Paperclip + AWS S3在我们的Rails3/Heroku应用程序中存储图像

Mik*_*sey 4 image-processing amazon-s3 paperclip ruby-on-rails-3

我们已经构建了一个rails应用程序,其中包含多个用户和每个用户的图像.在我们的localhost上完成所有开发工作,我们为用户和照片提供了工作种子......但是现在我们正在尝试使用S3进行图像存储,我们在...期间遇到错误...迁移步骤,执行此操作时:

rake db:migrate:reset

对这个问题道歉,但是我们已经在这个问题上持续了11个小时,经历了关于这个问题的每一个相关的Stack问题.很多类似的帖子都有NoSuchBucket错误和其他类型的问题,但我们没有提出任何建议的修改已经解决了我们的问题...也许它与我们正在使用的宝石的最新版本有关?

我们使用的是Rails 3.0.4,Ruby 1.8.7,Paperclip 2.3.8,aws-s3 0.6.2

我们使用/ migrate /文件夹中的seeds.rb文件为初始用户添加种子,为每个用户添加照片.在本地计算机上存储文件和图像(使用回形针,但不是S3)时,这始终正常工作.我们还测试了删除种子文件,只是使用工作应用程序创建一个新用户并得到了同样的错误:

凭据不是路径,文件或散列

对于用户模块,我们已经测试了通过(a)yml文件和(b)直接在用户模型中设置以下S3密钥的选项.access_key_id:'秘密'secret_access_key:'秘密'

我们已尝试从我们的localhost(尚未使用heroku)执行此操作,我们也尝试通过Heroku运行此操作.

我们似乎尝试了这些键的布局的每个排列,但我们最常得到的错误是:

无法将Module转换为Hash

谷歌搜索此错误消息返回零结果,所以我们不知道那里发生了什么.这是最令人沮丧的部分......似乎每一次尝试都让我们回到了这个错误.

我们也试过了两个:

(1)硬编码用户模型中的访问密钥,如下所示:

:access_key_id => ENV['accesskeyid'],
:secret_access_key => ENV['secretaccesskey'],
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们经常遇到这个错误:

您没有提供所需的访问密钥.请提供access_key_id和secret_access_key.

令人沮丧,因为我们总是列出两个项目,使用和不使用引号进行测试,更改订单等.

我们尝试了(a)与ENV ['accesskeyid']和(b)没有那些...简单地blahblah =>'accesskeyid'.

(2)将密钥放入yml文件中,如下所示:

has_attached_file :photo,
  :storage => :s3,
  :s3_credentials => "#{Rails.root}/config/s3.yml",
  :path => "/:photo/:filename"
Run Code Online (Sandbox Code Playgroud)

在yml文件中使用此文件:

development:
  access_key_id: accesskeyid
  secret_access_key: secretaccesskey
  bucket: ourbucketname
production:
  access_key_id: accesskeyid
  secret_access_key: secretaccesskey
  bucket: ourbucketname
Run Code Online (Sandbox Code Playgroud)

我们尝试使用键周围的单引号,没有.

我们还尝试在模型中定义存储桶,而不是在yml文件中定义存储桶,并得到相同的错误.

(3),这样设置:

如果Rails.env =="production"S3_CREDENTIALS = {:access_key_id => ENV ['S3_KEY'],:secret_access_key => ENV ['S3_SECRET'],:bucket =>"ourbucket"}否则S3_CREDENTIALS = Rails.root.join ("config/s3.yml")
结束

has_attached_file:photo,:storage =>:s3,:styles => {:small =>"50x50>",:thumb =>"75x75>",:medium =>"400x400>"},:path =>"/ :照片/:文件名"

在我们的yml文件中使用相同的内容.

这给了我们这个错误:

凭证不是文件,路径或散列

当然,我们四重检查我们是否拥有正确的访问密钥(来自我们的AWS账户),并测试了几种不同的设置哈希的方法,但从未得到我们想要的.

以下是Gemfile的相关部分:gem'aws-s3',:require =>'aws/s3'#在Amazon gem'Paperclip'上存储图像

作为另一种尝试,我们尝试在Gemfile中使用gem right_aws,但这导致了这个错误:

没有这样的文件加载 - aws/s3(你可能需要安装aws-s3 gem)

请注意,我们一直在做所有这些并且从localhost而不是从现场Heroku应用程序进行迁移时遇到所有这些错误,但是甚至无法通过这个简单的"种子用户"步骤.

目前,我们的桶名为media.oururl.com.在存储桶名称中有句号是否存在问题?

我也想问一下这些人,但考虑到这个社区有多么神奇,我希望你们中的一个人知道我们做错了什么.

非常感谢 - 希望这有助于其他跟随我们的人.

小智 5

优秀的问题.我前段时间花了很长时间处理类似的问题

主要问题是您需要将以下代码移动到它自己的初始化文件中:

if Rails.env == "production" 
   S3_CREDENTIALS = { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'], :bucket => "ourbucket"} 
 else 
   S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end
Run Code Online (Sandbox Code Playgroud)

然后,您应该将以下行添加到您拥有*has_attached_file的模型中:photo*要添加的行是.

:s3_credentials => S3_CREDENTIALS,
Run Code Online (Sandbox Code Playgroud)

这是你以前缺少的.

此外,当您声明您的存储桶名称时,请确保它适用于标准我们.如果您使用其他位置之一,则必须适当更新路径.

希望这可以帮助!