CarrierWave / MiniMagick 转换后不更新文件扩展名
CarrierWave / MiniMagick not updating file extension after convert
我正在使用 MiniMagick 和 CarrierWave 在 Rails 5.2 应用程序上处理一些图像。我的目标是将原始图像转换为 jpg,并创建两个其他版本(调整大小)。
我的问题是,虽然正确处理了“版本”,但原始文件已转换但其扩展名未更新为 .jpg。例如,如果我通过上传器传递 this image,我将获得以下三张图片:placeholder-image.png
、large_placeholder-image.jpg
和 thumb_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
我正在使用 MiniMagick 和 CarrierWave 在 Rails 5.2 应用程序上处理一些图像。我的目标是将原始图像转换为 jpg,并创建两个其他版本(调整大小)。
我的问题是,虽然正确处理了“版本”,但原始文件已转换但其扩展名未更新为 .jpg。例如,如果我通过上传器传递 this image,我将获得以下三张图片:placeholder-image.png
、large_placeholder-image.jpg
和 thumb_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