codenamev
6/21/2013 - 2:16 PM

Custom file names with Carrierwave and Amazon S3

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