Carrierwave的问题:转换

tdp*_*110 6 file-upload ruby-on-rails carrierwave

我想Carrierwave生成一些图像版本,一个是png格式,一个是jpeg格式,但我似乎无法让它工作.我意识到在这里和其他地方已经提出了几个类似的问题,但我找不到解决方案.粗略地说,这就是我所拥有的:

class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  version :jpeg do 
    process :convert => 'jpg'
    # more procesors
    process :processed => :jpg
  end

  version :png do
    process :convert => 'png'
    # more processors 
    process :processed => :png
  end

  def store_path(for_file = filename)
    if version_name != :png
      return "#{version_name}.jpg"
    else
      return "#{version_name}.png"
    end
  end

  def filename
    filename = if version_name != :png
      super != nil ? super.split('.').first + '.jpg' : super
    else 
      super != nil ? super.split('.').first + '.png' : super
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

因此,无论我传入的图像格式类型如何,都会生成两个文件:一个命名jpg.jpg,一个命名png.png.jpg.jpg确实总是一个JPEG文件(用Unix的file命令验证),BUT png.png只是一个真正的PNG格式文件,当且仅当我最初传入一个png格式的文件时(传入一个jpeg导致一个jpeg格式的文件)!

想法?

这可能没什么用,但我发现这个convert方法Carrierwave本身就是可疑的:convert(some_format)调用manipulate!(:format => some_format),而调用又调用(some_image_object).write("#{some_format}:#{current_path}").现在,如果传入的原始图像是bla.format(格式= jpg,png等),current_path则扩展名为.format(通过猴子补丁测试manipulate!).图像格式转换的工作方式RMagickwrite使用具有所需扩展名的参数进行调用.那么为什么上面的jpeg转换实际发生呢?如果是这样,为什么png转换会失败?

此外,如果它有用,我在Rails 3.0.9和Carrierwave 0.5.6上

谢谢!

tdp*_*110 5

所以我不确定为什么会这样,但事实证明问题出在# more processors我隐藏的png版本的部分.从版本中省略它们会导致任何输入类型的正版PNG文件.这些处理器调用manipulate!并执行一些操作.相反,修复是调用manipulate!(:format => 'png').好极了.