我正在尝试使用carrierwave向s3进行简单的上载,但是以某种方式在heroku上的生产中却无法正常工作:文件始终放在上载store_dir
定义的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
有人有什么想法吗?
在github上的carrierwave Wiki上查看,有一个部分说明了如何在heroku上使载波有效:
您可以通过将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