Custom file names with Carrierwave and Amazon S3
# uploader
class DocumentUploader < CarrierWave::Uploader::Base
storage :fog
def store_dir
"uploads/#{Rails.env}/#{model.class.to_s.underscore.pluralize}/#{mounted_as}/#{model.id}"
end
end
def store_path(for_file = filename)
"uploads/#{Rails.env}/#{model.class.to_s.underscore.pluralize}/#{mounted_as}/#{model.id}/#{for_file}"
end
def filename(uploaded_file = file)
if uploaded_file.present?
"Document with custom title ##{model.id}.#{uploaded_file.extension}"
end
end
end
# Carrierwave initializer in `config/initializers/carrierwave.rb`
CarrierWave.configure do |config|
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => 'replace-this-with-your-access-key-id',
:aws_secret_access_key => 'replace-this-with-your-secret-access-key'
}
config.fog_directory = 'rename-this-to-a-custom-directory-for-your-app'
config.fog_public = false
config.fog_attributes = {'Cache-Control'=>'max-age=300000000'}
config.cache_dir = "#{Rails.root}/tmp/uploads"
end
# model
class Attachment < ActiveRecord::Base
mount_uploader :document, DocumentUploader
# these methods fix the filename persistance issue
def read_uploader(column)
self[column]
end
def write_uploader(column, identifier)
self[column] = identifier
end
end