carrierwave在开发中上传到s3但未在生产中上传(heroku)

时间:2018-02-16 16:44:00

标签: ruby-on-rails amazon-s3 carrierwave

我正在尝试使用carrierwave进行简单的上传到s3但不知何故它在heroku上的生产中不起作用:文件总是放在上传器中定义的store_dir中但不放在s3中桶。

在开发中,当我尝试它工作正常。我遵循了carrierwave github aws的说明,但由于它不起作用我没有想法。

以下是我的上传者和我的carrierwave.rb文件:

class PhotoUploader < CarrierWave::Uploader::Base
  storage :fog

  def extension_whitelist
    %w(jpg jpeg gif png)
  end
end


 CarrierWave.configure do |config|
   config.fog_provider = 'fog/aws'                        # required
   config.fog_credentials = {
     provider:              'AWS',                        # required
     aws_access_key_id:     ENV['S3_KEY'],                        # required
     aws_secret_access_key: ENV['S3_SECRET'],                        # required
     region:                ENV['S3_REGION'],
     # host:                  's3.example.com',             # optional, defaults to nil
     # endpoint:              'https://s3.example.com:8080' # optional, defaults to nil
    }
   config.fog_directory  = ENV['S3_BUCKET']                                   # required
   config.fog_public     = false                                                 # optional, defaults to true
   config.fog_attributes = { cache_control: "public, max-age=#{365.days.to_i}" } # optional, defaults to {}
 end

任何人都有任何想法?

2 个答案:

答案 0 :(得分:1)

查看github上的carrierwave Wiki,有一节介绍如何在heroku上运行carrierwave:

您可以通过将Uploader类中的cache_dir设置为tmp目录来解决此问题

class AvatarUploader < CarrierWave::Uploader::Base
 def cache_dir
   "#{Rails.root}/tmp/uploads"
 end
end

# config.ru
require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Static, :urls => ['/carrierwave'], :root => 'tmp' # adding this line
run YourApplicationName::Application

# config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.root = Rails.root.join('tmp') # adding these...
  config.cache_dir = 'carrierwave' # ...two lines

  config.fog_credentials = {
    :provider               => 'AWS',                        # required
    :aws_access_key_id      => 'key',                        # required
    :aws_secret_access_key  => 'secret',                     # required
    :region                 => 'eu-west-1',                  # optional, defaults to 'us-east-1'
    :host                   => 's3.example.com',             # optional, defaults to nil
    :endpoint               => 'https://s3.example.com:8080' # optional, defaults to nil
  }
  config.fog_directory  = 'directory'                             # required
  config.fog_public     = false                                   # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
end

答案 1 :(得分:0)

CarrierWave.configure do |config|
  config.fog_credentials = {
    # In Heroku, follow http://devcenter.heroku.com/articles/config-vars
    #
    # $ heroku config:add S3_KEY=your_s3_access_key S3_SECRET=your_s3_secret S3_REGION=eu-west-1 S3_ASSET_URL=http://assets.example.com/ S3_BUCKET_NAME=s3_bucket/folder

    # Configuration for Amazon S3
    :provider              => 'AWS',
    :aws_access_key_id     => ENV['S3_KEY'],
    :aws_secret_access_key => ENV['S3_SECRET'],
    :region                => ENV['S3_REGION']
  }

  # For testing, upload files to local `tmp` folder.
  if Rails.env.test? || Rails.env.cucumber?
    config.storage = :file
    config.enable_processing = false
    config.root = "#{Rails.root}/tmp"
  else
    config.storage = :fog
  end

  config.cache_dir = "#{Rails.root}/tmp/uploads"                  # To let CarrierWave work on heroku

  config.fog_directory    = ENV['S3_BUCKET_NAME']
  config.s3_access_policy = :public_read                          # Generate http:// urls. Defaults to :authenticated_read (https://)
  config.fog_host         = "#{ENV['S3_ASSET_URL']}/#{ENV['S3_BUCKET_NAME']}"
end

另外,请检查How to: Make Carrierwave work on Heroku并注意以下事实:通过将cache_dir设置为"#{Rails.root}/tmp/uploads"在Heroku上进行这项工作会带来不利的副作用,使上传无法在表单重新显示之间起作用。

相关问题