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

时间:2018-08-13 06:44:13

标签: ruby-on-rails rails-activestorage

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

3 个答案:

答案 0 :(得分:3)

@George有一个很好的答案,我还是要提一下我的,根据我对您问题的理解,它应该与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

希望这对您有用:)

答案 1 :(得分:1)

ActiveStorage::Blob#variant容纳了不同的用例,因此请直接处理ActiveStorage::Variation。以下内容假设使用最新的Rails主版本而不是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

答案 2 :(得分:1)

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

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

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