CarrierWave: создать 1 загрузчик для нескольких типов файлов - PullRequest
7 голосов
/ 22 сентября 2011

Я хочу создать 1 загрузчик для файлов разных типов (изображения, pdf, видео)

Для каждого типа содержимого будут разные действия

Как определить тип содержимого файла?

Например:

if image?
  version :thumb do
    process :proper_resize    
  end
elsif video?
  version :thumb do
    something
  end
end

1 Ответ

9 голосов
/ 22 сентября 2011

Я сталкивался с этим, и это выглядит как пример того, как решить эту проблему: https://gist.github.com/995663.

Загрузчик сначала загружается при вызове mount_uploader, после чего такие вещи, какif image? или elsif video? не будет работать, потому что файл для загрузки еще не определен.Вам нужно будет вызывать методы, когда вместо этого создается экземпляр класса.

То, что я сделал по приведенной выше ссылке, переписывает метод process, так что он принимает список расширений файлов и обрабатывает их, только если ваш файл соответствует одному из этих расширений

# create a new "process_extensions" method.  It is like "process", except
# it takes an array of extensions as the first parameter, and registers
# a trampoline method which checks the extension before invocation
def self.process_extensions(*args)
  extensions = args.shift
  args.each do |arg|
    if arg.is_a?(Hash)
      arg.each do |method, args|
        processors.push([:process_trampoline, [extensions, method, args]])
      end
    else
      processors.push([:process_trampoline, [extensions, arg, []]])
    end
  end
end

# our trampoline method which only performs processing if the extension matches
def process_trampoline(extensions, method, args)
  extension = File.extname(original_filename).downcase
  extension = extension[1..-1] if extension[0,1] == '.'
  self.send(method, *args) if extensions.include?(extension)
end

Затем вы можете использовать это для вызова того, что раньше обрабатывалось

IMAGE_EXTENSIONS = %w(jpg jpeg gif png)
DOCUMENT_EXTENSIONS = %(exe pdf doc docm xls)
def extension_white_list
  IMAGE_EXTENSIONS + DOCUMENT_EXTENSIONS
end

process_extensions IMAGE_EXTENSIONS, :resize_to_fit => [1024, 768]

Для версий в wiki-странице carrierwave есть страница, которая позволяет вам условно обрабатывать версии, если вы находитесь на> 0.5.4,https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing. Вам придется изменить код версии, чтобы он выглядел так:

version :big, :if => :image? do
  process :resize_to_limit => [160, 100]
end

protected
def image?(new_file)
  new_file.content_type.include? 'image'
end
...