【问题标题】:How to setup Amazon S3 with Spree?如何使用 Spree 设置 Amazon S3?
【发布时间】:2015-07-10 08:42:56
【问题描述】:

我尝试在网上阅读很多内容,但没有任何帮助。所以需要一个具体的答案。如何配置 S3 以使用 Spree? 我正在使用 Spree 3.0.1 和 Rails 4.2.1。

我有 spree.rb 作为:

Spree.config do |config|
   # Example:
   # Uncomment to override the default site name.
  #  config.site_name = "Gazella Running Costumes"
  #  config.logo = "store/rungazella.png"

  #S3 configuration
  if Rails.env.production? then
       #production. Store images on S3.
       # development will default to local storage
      attachment_config = {
      s3_credentials: {
        access_key_id: ENV["S3_KEY"],
        secret_access_key: ENV["S3_SECRET"],
        bucket: ENV["S3_BUCKET"],
      },


      storage:        :s3,
      s3_headers:     { "Cache-Control" => "max-age=31557600" },
      s3_protocol:    "https",
      bucket:         ENV["S3_BUCKET"],

      path:          ":rails_root/public/:class/:attachment/:id/:style/:basename.:extension",
      default_url:   "/:class/:attachment/:id/:style/:basename.:extension",
      default_style: "product",
      }

      attachment_config.each do |key, value|
           Spree::Image.attachment_definitions[:attachment][key.to_sym] = value
      end
  end
Spree.user_class = "Spree::User"
end

我的 Gemfile 也是

source 'https://rubygems.org'
gem 'rails', '4.2.1'
ruby '2.2.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
group :development, :test do
    gem 'byebug'
    gem 'web-console', '~> 2.0'
    gem 'spring'
end
gem 'spree', '3.0.1'
gem 'spree_gateway', github: 'spree/spree_gateway', branch: '3-0-stable'
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '3-0-stable'
gem 'rails_12factor', group: :production
gem 'pg'
gem 'aws-sdk'

【问题讨论】:

  • 您是否使用回形针 gem 来处理图像?
  • 是的,我正在使用回形针。
  • 你有解决方案吗?我自己也在为此苦苦挣扎,无法让它发挥作用
  • 在我正在进行的项目中,我发现 S3 无法正常工作,因为 Spree::Image 已重新打开,并且 pathurl 选项也设置在那里,这赢得了那些初始化程序中的设置。此外,从 Spree 3.0.2 开始,aws-sdk 必须是 < 2.0。希望这会有所帮助。

标签: ruby-on-rails heroku amazon-s3 paperclip spree


【解决方案1】:

首先您需要添加版本低于 2.0 的 gem 'aws-sdk':

gem 'aws-sdk', '< 2.0'

然后,您需要在 spree 初始化程序中添加此代码:

Rails.env.production?
  attachment_config = {
    s3_credentials: {
      access_key_id:     ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      bucket:            ENV['S3_BUCKET_NAME']
    },

    storage:        :s3,
    s3_headers:     { "Cache-Control" => "max-age=31557600" },
    s3_protocol:    "https",
    bucket:         ENV['S3_BUCKET_NAME'],
    url:            ":s3_domain_url",

    path:           "/:class/:id/:style/:basename.:extension",
    default_url:    "/:class/:id/:style/:basename.:extension",
    default_style:  "product"
  }

  attachment_config.each do |key, value|
    Spree::Image.attachment_definitions[:attachment][key.to_sym] = value
  end
end

【讨论】:

    【解决方案2】:

    您可以尝试从设置中删除path

    path: ":rails_root/public/:class/:attachment/:id/:style/:basename.:extension",

    当图像将存储在 S3 中时,有一个 path 引用您的 Rails 根目录似乎很奇怪。

    【讨论】:

      【解决方案3】:

      首先从spree.rb Spree 后端删除您的 S3 配置设置,General Settings =&gt; image settings =&gt; enable S3 中已有此配置。

      嘿,您只需要从您的 spree 后端启用 S3。提供那里所需的基本详细信息。 在您的初始化程序中添加以下行paperclip.rb

      if Rails.env.production?
          Paperclip.interpolates(:s3_eu_url) do |attachment, style|
            "#{attachment.s3_protocol}://#{Spree::Config[:s3_host_alias]}/#{attachment.bucket_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
          end
          Paperclip::Attachment.default_options[:use_timestamp] = false
          Paperclip::Attachment.default_options[:s3_protocol] = "https"
      end
      

      您的附件 URL 应该是 :s3_eu_url,因为我们在 initilizer 中为此 URL 初始化了插值

      【讨论】:

      • 但是我在 spree 3 下找不到它。
      【解决方案4】:

      使用这个宝石

       gem 'aws-sdk', '< 2.0'
      

      在 config/initializers/spree.rb 中使用这个 sn-p

      spree.config do |config|
        attachment_config={
        s3_credentials: {
        access_key_id: ENV['AWS_ACCESS_KEY_ID'],
        secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
        bucket: ENV['ENV_BUCKET_NAME']
        },
        storage:     :s3,
        s3_headers:  {"Cache-Control"=>"max-age=31557600"},
        s3_protocol: "https",
        bucket:      ENV['S3_BUCKET_NAME'],
        url:         "url",
        styles:      {
                       mini:   "48x48>",
                       small:  "100x100>",
                       product:"240x240>",
                       large:  "600x600>"
                     },
        path:        "/spree/:class/:id/:style/:basename.:extension",
        default_url: "/spree/products/:id/:style/:basename.:extension",
        default_style: "product",
        }
        attachment_config.each do |key,value|
      
         Spree::Image.attachment_definitions[:attachment][key.to_sym] = value
      
        end
      
      end
      

      source

      【讨论】:

        【解决方案5】:

        我在这里找到了答案:NameError (uninitialized constant Paperclip::Storage::S3::AWS):

        将您的 gemfile aws-sdk gem 更改为: gem aws-sdk, &lt; 2.0

        显然,问题始于 aws-sdk 的较新版本,因此您需要低于 2.0 的版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 2014-04-18
          • 2012-07-14
          • 2014-03-06
          • 2012-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多