2013-05-09 12 views
5

У меня есть загрузчик, где я реализую метод #filename для получения пользовательского и уникального имени файла, но похоже, что этот метод игнорируется перед сохранением файла (я загружаю в rackspace с туман камень)Изменить имя файла перед сохранением с помощью Carrierwave

Вот загрузчик:

class MyImageUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 

    ... 

    def filename 
    if original_filename.present? 
     "#{secure_token}.#{file.path.split('.').last.downcase}" 
    else 
     super 
    end 
    end 

    ... 

    private 

    def secure_token 
    var = :"@#{mounted_as}_secure_token" 
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) 
    end 
end 

А вот тест на консоли (я тестирую проблему с большими именами файлов, что я думал, был решен с помощью метода пользовательского #filename) :

1.9.3-p392 :002 > f = File.open('/Users/myuser/Desktop/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png') 
=> #<File:/Users/myuser/Desktop/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png> 
1.9.3-p392 :003 > my_model_instance.image = f 
Errno::ENAMETOOLONG: File name too long - /Users/myuser/app/tmp/uploads/20130509-1723-16769-8458/thumb_lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat.png 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1371:in `initialize' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1371:in `open' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1371:in `block in copy_file' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1370:in `open' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1370:in `copy_file' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:477:in `copy_file' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:396:in `block in cp' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1515:in `block in fu_each_src_dest' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1531:in `fu_each_src_dest0' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1513:in `fu_each_src_dest' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:395:in `cp' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:205:in `copy_to' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/cache.rb:121:in `block in cache!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:17:in `with_callbacks' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/cache.rb:112:in `cache!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/versions.rb:231:in `block in cache_versions!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/versions.rb:216:in `each' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/versions.rb:216:in `cache_versions!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:18:in `block in with_callbacks' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:18:in `each' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:18:in `with_callbacks' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/cache.rb:112:in `cache!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/mount.rb:315:in `cache' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/mount.rb:173:in `image=' 
    from /Users/myuser/.rvm/gems/[email protected]/bundler/gems/carrierwave-mongoid-28a9b718d42b/lib/carrierwave/mongoid.rb:39:in `image=' 

Так что я думаю, что мне нужно изменить имя файла перед сохранением, чтобы получить пользовательское имя файла полностью работает, потому что на самом деле файл только переименовать после закачанный в Rackspace (только если имя файла это не так велика)

ответ

4

Загрузка происходит во время шага кэширования (который происходит локально), а не с этапа сохранения (что происходит в тумане). Чтение , похоже, что у несущей волны есть метод, который вы можете переопределить, чтобы сделать это: full_original_filename

Если проблема, которую вы пытаетесь решить, заключается в том, чтобы сделать кешированное имя файла короче, может работать следующее. Если вы хотите изменить это имя файла позже, вам нужно будет использовать official solution for that.

MAX_FILENAME_LENGTH = 64 # arbitrary limit, your milage may vary 

def full_original_filename 
    filename = super 

    return filename if !filename.present? 

    extension = File.extname(filename) 
    basename = File.basename(filename, extension)[0...MAX_FILENAME_LENGTH] 
    basename + extension 
end 
+0

Привет, Тааво, благодарю вас за помощь. Ваше изменение эффективно обновляет локальное имя файла перед чтением, но похоже, что мне нужно сначала перенести файл, потому что я получаю ошибку «Нет такого файла или каталога», указывающую на новое имя файла:/Users/myuser/app/tmp/uploads /20130510-1222-59710-2769/4f7dfe24-c39c-4cda-bf99-ed09cea0a162.png – rdavila

+0

Я написал альтернативную реализацию, которая может работать, но я подозрительный, это также не решит вашу проблему. Я не тестировал его ... – Taavo

+0

Он работает. Спасибо, Тааво !!! – rdavila

Смежные вопросы