如何在 ActiveStorage 中使用变体选项后保存图像副本。

How to save a copy of image after using variant option in ActiveStorage.

我在使用 ActiveStorage 时遇到这个问题,我需要处理图像,我的要求是保存处理后的图像并在裁剪和其他转换后将其附加到新模型。

ActiveStorage::Blob#variant 适应不同的用例,所以直接处理 ActiveStorage::Variation。以下假设最新的 Rails master 而不是 Rails 5.2:

variation = ActiveStorage::Variation.new(resize_to_fit: [100, 100], crop: true)

message.header_image.open do |input|
  variation.transform(input, format: "png") do |output|
    message.cropped_header_image.attach \
      io: output,
      filename: "#{message.header_image.filename.base}.png",
      content_type: "image/png"
  end
end

@George 有一个很好的答案,但我还是要提一下我的,根据我对你问题的理解,它应该与 rails 5.2 一起使用,

创建一个临时文件,先获取文件,如果它在你的云存储中,如果没有那么你不需要这部分,在这种情况下使用 blob 获取路径即可。

path = Rails.root.join('tmp', ModelVariable.main_image.blob.filename.to_s).to_s
File.open(path, 'wb') do |file|
  file.write(ModelVariable.main_image.blob.download)
end

做你的定制

customize_image = MiniMagick::Image.open(path)
customize_image.crop(crop_params)

将它附加到您想要的不同模型

file = File.open(customize_image.path)
filename = Time.zone.now.strftime("%Y%m%d%H%M%S") + ModelVariable.main_image.blob.filename.to_s
NewModelVaribale.customized_image.attach(io: file, filename: filename)

保存

customized_product.save

希望这对你有用:)

我想将此添加到 Faizaan 的回答中

如果您在本地存储,请使用

path = ActiveStorage::Blob.service.send(:path_for, ModelVariable.main_image.blob.key)