CarrierWave 和正确的文件扩展名取决于其内容

Ale*_*lev 5 ruby ruby-on-rails rmagick ruby-on-rails-3 carrierwave

如何让 CarrierWave 根据文件内容添加正确的扩展名?例如,如果我上传文件“logo”(不带扩展名的 PNG 文件),CarrierWave 应该将其保存为“logo.png”。文件“img.gif”(扩展名不正确的JPG文件)应分别保存为“img.jpg”。

kei*_*ley 4

您可以执行几项操作,具体取决于您是否正在使用processversion执行此操作。

如果它是一个版本,Carrierwave wiki 有一种方法可以做条件版本。https://github.com/jnicklas/rierwave/wiki/How-to%3A-Do-conditional-processing

version :big, :if => :png? do
  process ...
end

protected
def png?(new_file)
  new_file.content_type.include? 'png'
end
Run Code Online (Sandbox Code Playgroud)

如果您正在使用该process方法,您可能需要查看以下内容: https: //gist.github.com/995663

将这些添加到您的代码中以解决以下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
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它来调用以前的进程,有选择地针对每种文件类型

PNG = %w(png)
JPG = %w(jpg jpeg)
GIF = %w(gif)
def extension_white_list
  PNG + JPG + GIF
end

process_extensions PNG, :resize_to_fit => [1024, 768]
process_extensions JPG, :... 
process_extensions GIF, :...
Run Code Online (Sandbox Code Playgroud)