Nomes de arquivos personalizados com Carrierwave e Amazon S3

Com o seguinte uploader app/uploaders/document_uploader.rb:

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

Montado em um modelo assim:

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

Configurando a onda portadora com S3:

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

Digamos que carregamos um arquivo chamado “JunkName para um arquivo.pdf” no ambiente de desenvolvimento,
agora você deve obter um arquivo personalizado salvo no S3 como:uploads/development/attachments/document/3/Document with custom title #3.pdf

As funções read_uploadere write_uploaderem seu modelo podem ser um bug do Carrierwave … mas estou esperando para ver: https://github.com/carrierwaveuploader/carrierwave/issues/1132

Até então, aproveite. Caçar isso não foi divertido.