Hi,
I have a very odd issue with CarrierWave and S3, I have a form
uploading an image to S3, works fine on my development machine but I
cannot get it to work on Heroku.
I've used the Heroku console and run a test upload to S3 with the same
credentials used by my app and everything works fine, but once handled
by CarrierWave, I get a 403 error:
UsersController# (Excon::Errors::Forbidden) "Expected(200) Actual(403
Forbidden)\n reqMore
/app/.bundle/gems/ruby/1.9.1/gems/excon-0.6.3/lib/excon/connection.rb:
179:in `request'
/app/.bundle/gems/ruby/1.9.1/gems/fog-0.8.2/lib/fog/core/connection.rb:
20:in `request'
/app/.bundle/gems/ruby/1.9.1/gems/fog-0.8.2/lib/fog/storage/aws.rb:
329:in `request'
/app/.bundle/gems/ruby/1.9.1/gems/fog-0.8.2/lib/fog/storage/requests/
aws/put_object.rb:43:in `put_object'
/app/.bundle/gems/ruby/1.9.1/gems/fog-0.8.2/lib/fog/storage/models/aws/
file.rb:119:in `save'
/app/.bundle/gems/ruby/1.9.1/gems/fog-0.8.2/lib/fog/core/collection.rb:
50:in `create'
/app/.bundle/gems/ruby/1.9.1/gems/carrierwave-0.5.4/lib/carrierwave/
storage/fog.rb:229:in `store'
/app/.bundle/gems/ruby/1.9.1/gems/carrierwave-0.5.4/lib/carrierwave/
storage/fog.rb:79:in `store!'
My configuration is as follow: initializers/carrierwave.rb:
# CarrierWave S3 config
CarrierWave.configure do |config|
config.fog_credentials = {
:provider => 'AWS', # required
:aws_access_key_id => SETTINGS[Rails.env]['s3']
['access_key_id'], # required
:aws_secret_access_key => SETTINGS[Rails.env]['s3']
['secret_access_key'], # required
#:region => 'eu-west-1' # optional, defaults to
'us-east-1'
}
config.fog_directory = SETTINGS[Rails.env]
['bucket'] # required
#config.fog_host = '
s3.amazonaws.com' # optional,
defaults to nil
#config.fog_public = false #
optional, defaults to true
#config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} #
optional, defaults to {}
end
picture_uploader.rb:
class PictureUploader < CarrierWave::Uploader::Base
# Include RMagick or ImageScience support:
include CarrierWave::MiniMagick
# include CarrierWave::ImageScience
# Choose what kind of storage to use for this uploader:
storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be
mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{
model.id}"
end
# fix for Heroku, unfortunately, it disables caching, see:
https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Make-Carrierwave-work-on-Heroku
def cache_dir
"#{Rails.root}/tmp/uploads"
end
# Create different versions of your uploaded files:
version :thumb do
process :resize_to_fill => [96, 96]
end
version :mini do
process :resize_to_fill => [48, 48]
end
end
I've been dealing with this issue since yesterday night trying to test
everything...