CarrierWave / MiniMagick 转换后不更新文件扩展名

CarrierWave / MiniMagick not updating file extension after convert

我正在使用 MiniMagick 和 CarrierWave 在 Rails 5.2 应用程序上处理一些图像。我的目标是将原始图像转换为 jpg,并创建两个其他版本(调整大小)。

我的问题是,虽然正确处理了“版本”,但原始文件已转换但其扩展名未更新为 .jpg。例如,如果我通过上传器传递 this image,我将获得以下三张图片:placeholder-image.pnglarge_placeholder-image.jpgthumb_placeholder-image.jpg(请注意第一张图片是原来的,还有.png的扩展名)。

我不明白为什么会这样,任何帮助将不胜感激

代码如下:

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process convert: 'jpg'

  version :large do
    process resize_to_fit: [2000, 2000]
  end

  version :thumb do
    process resize_to_fit: [500, nil]
  end
end

也试过这个,导致同样的问题:

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

  version :jpg do
    process convert: 'jpg'
  end

  version :large, from_version: :jpg do
    process resize_to_fit: [2000, 2000]
  end

  version :thumb, from_version: :jpg do
    process resize_to_fit: [500, nil]
  end
end

不知道您是否仍然卡住了,但诀窍是您需要重写 filename 方法。

类似

process convert: 'jpg'
    
      
def filename
  super.chomp(File.extname(super)) + '.jpg' if original_filename.present?
end

另一种方法(我即将在我自己的应用程序中尝试,以及为什么我在这里偶然发现你的问题)是按版本覆盖它 – 参见 https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names

我已经使用版本名称 customization 解决了这个问题。请注意,我选择了不转换原始文件,这与我最初的做法有点不同。

这是我实现的代码片段:

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

  version :large do
    process resize_to_fit: [2000, 2000]
    process convert: 'jpg'

    def full_filename(for_file = model.file_name.file)
      "large_#{for_file.sub('png', 'jpg')}"
    end
  end

  version :thumb do
    process resize_to_fit: [500, nil]
    process convert: 'jpg'

    def full_filename(for_file = model.file_name.file)
      "thumb_#{for_file.sub('png', 'jpg')}"
    end
  end
end