【问题标题】:Aws missing region error when uploading image with paperclip gem Amazon S3使用回形针 gem Amazon S3 上传图像时出现 Aws 缺失区域错误
【发布时间】:2016-04-15 03:05:18
【问题描述】:

我对 Rails 比较陌生。我让回形针 gem 在本地开发中正常工作,用户在注册时上传头像没有问题。我通过 Heroku 部署到生产环境,并且在注册时使用上传的图像创建用户时也没有错误,但所有上传的图像在生产环境中都显示为缺少缩略图。我阅读并显然在生产中使用回形针我应该使用称为 Amazon S3 的东西(如果有更好的方法,请纠正我)所以我正在尝试这样做。

这是我在尝试使用上传的图片创建用户时遇到的错误:

Aws::Errors::MissingRegionError in Devise::RegistrationsController#create
missing region; use :region option or export region name to ENV['AWS_REGION']

这是我在生产和开发环境中所拥有的

config.paperclip_defaults = {
  storage: :s3,
  s3_host_name: 's3-ap-southeast-1.amazonaws.com',
  s3_credentials: {
    bucket: ENV['AWS_S3_BUCKET'],
    s3_region: ENV['S3_REGION'],
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  }
}

这是我的 paperclip.rb 初始化程序中的内容

Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'


    Paperclip::Attachment.default_options[:s3_host_name] = 's3-ap-southeast-1.amazonaws.com'

注意(我在中东)

这是我的用户模型中的内容

#paperclip gem storing avatar images


 has_attached_file :avatar, 
          :bucket => 'bucket_name',
          :styles => {
          :thumb    => ['100x100#',  :jpg, :quality => 70],
         :preview  => ['480x480#',  :jpg, :quality => 70],
         :large    => ['600>',      :jpg, :quality => 70],
         :retina   => ['1200>',     :jpg, :quality => 30]
},
        :convert_options => {
         :thumb    => '-set colorspace sRGB -strip',
         :preview  => '-set colorspace sRGB -strip',
         :large    => '-set colorspace sRGB -strip',
         :retina   => '-set colorspace sRGB -strip -sharpen 0x0.5'
}

我一直在寻找有关 S3 Paperclip Gem 和缺少区域错误的问题,但从未见过像这样说错误出在设计控制器中的问题。我认为这是因为 :avatar 之间的关联是与由设计控制的用户相关联,而我没有单独的用户控制器。

我觉得应该有一种比使用亚马逊 S3 更简单的方法来解决使用回形针 gem 在生产中丢失图像的问题。尤其是在没有 Amazon S3 的情况下,一切都在本地运行良好且花花公子。有什么替代建议吗?想法?

【问题讨论】:

    标签: ruby-on-rails amazon-web-services heroku amazon-s3 paperclip


    【解决方案1】:

    您不一定必须使用 Amazon 服务来存储您的图像,但如果您在 Heroku 上托管,则无法在本地存储。这是因为 heroku 使用临时文件系统,因此您必须预料到您在本地存储的任何内容都可能随时消失。当您需要扩展应用程序时,这会使事情变得更容易,因为如果您启动新的 dynos,您将不依赖任何本地存储(这也使 Heroku 的生活更轻松,因为他们不需要为共享存储而烦恼应安装应用程序的测功机)。

    现在,回到 S3。首先,您确实有其他选择,如果您使用带有回形针的 'fog' gem,您可以以相对简单的方式访问number of storage providers

    不过,S3 是最常见的,您的问题应该很容易通过定义 AWS_REGION 变量来解决。在 Heroku 上,您可以通过运行以下命令来做到这一点:

    heroku config:set AWS_REGION=us-west-2
    

    或您使用的任何地区。

    另外,我上次检查回形针与 AWS SDK 2 不兼容,所以如果您有奇怪的问题,可以尝试在 Gemfile 中使用它切换回 SDK 1:

    gem 'aws-sdk', '< 2.0'
    

    【讨论】:

    • 感谢您提供信息丰富的答案和解决方案。我听从了您的建议并安装了 v1 的 aws 并将所有 Aws 引用更改为 AWS 并定义了区域 - 这修复了我遇到的区域错误并现在用类似的错误替换它。设计中的 NameError::RegistrationsController#create uninitialized constant AWS::S3::Resource
    • 这个新错误也引用了设计注册控制器,就像旧错误一样,这并不奇怪,因为当我尝试通过图像上传注册新用户时会引发错误。我还没有创建注册控制器。您是否建议创建一个注册控制器以设计以某种方式解决问题?
    • 这很奇怪。错误的原因是 AWS SDK v1 没有 S3::Resource 类...我查看了回形针源中发生的情况,似乎他们已经删除了对 AWS SDK 版本的测试。如果您降级到回形针 4.3.0,一切都应该正常工作(仅当 SDK 版本不是 v1 时,它才使用 S3::Resource,并且我在我的一个项目中使用 S3 成功使用它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2012-11-22
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多