ActiveStorage面临这个问题,我需要处理图像,我的要求是保存经过处理的图像,并在裁剪和其他转换后将其附加到新模型上。
答案 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)