Ale*_*lev 5 ruby ruby-on-rails rmagick ruby-on-rails-3 carrierwave
如何让 CarrierWave 根据文件内容添加正确的扩展名?例如,如果我上传文件“logo”(不带扩展名的 PNG 文件),CarrierWave 应该将其保存为“logo.png”。文件“img.gif”(扩展名不正确的JPG文件)应分别保存为“img.jpg”。
您可以执行几项操作,具体取决于您是否正在使用process或version执行此操作。
如果它是一个版本,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)