7

在我的 Rails 应用程序中,我希望允许用户通过 Carrierwave 上传图像或非图像文件。目前 Carrierwave 可以很好地处理和处理图像文件,但不幸的是它完全丢弃了非图像文件。单个 Carrierwave 上传器是否有一种干净的方式来处理图像和非图像文件?

我将在下面包括我当前的上传者:

class AssetUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb do
   process :resize_to_fill => [300, 300]
  end

  version :icon do
   process :resize_to_fill => [48, 48]
  end

  def extension_white_list
    %w(jpg jpeg gif png pdf doc xls docx xlsx ppt)
  end

end
4

2 回答 2

2

我有这个确切的问题。我用一个多级间接的古老的comp sci解决方案解决了这个问题:一种蹦床/重击方法,动态决定是否根据文件扩展名进行处理。

你可以在这里找到实现:https ://gist.github.com/995663

(由于 CarrierWave DSL 的工作方式,在版本块中引入逻辑的幼稚方法实际上不起作用 - 逻辑需要推迟到调用)

我希望这会有所帮助。

于 2011-05-27T16:56:55.763 回答
1

我知道这已经得到解答,但亚伦的回答并没有完全解决问题。如果您只需要调用,则可以使用他在https://gist.github.com/995663process上的建议,但如果您想有选择地使用version.

有关版本,请参阅此处的 carrierwave wiki 页面:https ://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing

您现在可以在代码中执行此操作,它只会处理图像上的版本块

version :thumb, :if => :image? do
  process ...
end

protected

def image?(new_file)
  new_file.content_type.include? 'image'
end
于 2011-09-23T17:10:26.697 回答