追溯更改回形针大小验证 -> 以前的图像现在无效
Retroactively change paperclip size validation -> previous images now invalid
假设我的模型上有一个回形针附件,其大小验证为 10GB,并且一群用户上传的图像达到该最大大小。
如果我随后将大小验证更改为更小的值,例如 5GB,则之前上传的任何大于新验证的图像现在都无效。因此,即使尝试触摸模型也会失败,因为此验证失败。在图像上调用 reprocess!
没有帮助,因为它只是重新处理 styles
但不会调整原始图像的大小。
这里可以做什么来验证不再通过更新的、较小尺寸验证的旧图像?
最后只是直接使用 imagemagick 编写脚本来调整现有图像的大小(一次 50%),然后重新保存。假设型号名称 Model
和回形针附件 picture
:
puts "Finding and resizing images from models..."
invalid_models = Model.where("picture_file_size > 10_000_000")
puts "Found #{invalid_models.count} models with oversized images"
invalid_models.each do |m|
puts "Model #{m.id} has image with size #{m.picture.size}"
while(!m.valid?) do
puts "\tShrinking by 50%..."
tmp_filename = "/tmp/#{m.picture_file_name}"
%x(convert #{m.picture.url} -resize 50% #{tmp_filename})
m.picture = open(tmp_filename)
m.save(validate: false) # skip validations in case it's still too large
puts "\tNew size=#{m.picture.size}, valid?=#{m.valid?}"
end
end
puts "Done!"
假设我的模型上有一个回形针附件,其大小验证为 10GB,并且一群用户上传的图像达到该最大大小。
如果我随后将大小验证更改为更小的值,例如 5GB,则之前上传的任何大于新验证的图像现在都无效。因此,即使尝试触摸模型也会失败,因为此验证失败。在图像上调用 reprocess!
没有帮助,因为它只是重新处理 styles
但不会调整原始图像的大小。
这里可以做什么来验证不再通过更新的、较小尺寸验证的旧图像?
最后只是直接使用 imagemagick 编写脚本来调整现有图像的大小(一次 50%),然后重新保存。假设型号名称 Model
和回形针附件 picture
:
puts "Finding and resizing images from models..."
invalid_models = Model.where("picture_file_size > 10_000_000")
puts "Found #{invalid_models.count} models with oversized images"
invalid_models.each do |m|
puts "Model #{m.id} has image with size #{m.picture.size}"
while(!m.valid?) do
puts "\tShrinking by 50%..."
tmp_filename = "/tmp/#{m.picture_file_name}"
%x(convert #{m.picture.url} -resize 50% #{tmp_filename})
m.picture = open(tmp_filename)
m.save(validate: false) # skip validations in case it's still too large
puts "\tNew size=#{m.picture.size}, valid?=#{m.valid?}"
end
end
puts "Done!"