使用不同文件类型上载Carrierwave文件

时间:2015-06-07 21:21:29

标签: ruby-on-rails ruby image pdf carrierwave

我有以下作为我的FileUploader:

class FileUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  version :thumb, if: :image? do
    # For images, do stuff here
  end

  version :preview, if: :pdf? do
     # For pdf, do stuff here
  end

  protected

  def image?(new_file)
    new_file.content_type.start_with? 'image'
  end

  def pdf?(new_file)
    new_file.content_type.start_with? 'application'
  end

end

我从carrierwave github页面得到了这个。它主要起作用,但如果我不想要不同的版本呢?我基本上只是想做某些过程,如果它是一个pdf,或某些过程,如果它是一个图像。我可能会在将来允许其他类型的文件,所以如果我有一个简单的方法也可以这么做。

例如,我可能想要使用imgoptim(如果它是图像),然后使用pdf优化库(如果它是pdf等)

我试过了:

if file.content_type = "application/pdf"
    # Do pdf things
elsif file.content_type.start_with? 'image'
    # Do image things
end

但是得到错误:{File {1}} file for FileUploader:Class`

3 个答案:

答案 0 :(得分:7)

你应该尝试使用这样的

class FileUploader < CarrierWave::Uploader::Base  
  include CarrierWave::MiniMagick

  process :process_image, if: :image?
  process :process_pdf, if: :pdf?

  protected

  def image?(new_file)
    new_file.content_type.start_with? 'image'
  end

  def pdf?(new_file)
    new_file.content_type.start_with? 'application'
  end

  def process_image
    # I process image here
  end

  def process_pdf
    # I process pdf here
  end
end

答案 1 :(得分:3)

该异常表示您正在类级别范围内调用实例变量。 添加调试器断点并打印出自己,您将了解正在发生的事情。

解决方案是将逻辑包装到实例方法中,并将此方法用作默认进程。

process :process_file

def process_file
  if file.content_type = "application/pdf"
      # Do pdf things
  elsif file.content_type.start_with? 'image'
      # Do image things
  end
end

通过这样做,您可以摆脱不需要的版本,并根据mime类型处理您想要的任何内容。

答案 2 :(得分:2)

尝试在if中使用process,例如

process :action, :if => :image?

相关: Conditional versions/process with Carrierwave