为了节省云中的空间,您将如何使用activestorage调整大小和压缩图像预上传?

最佳答案

我在下面的本地存储开发中测试了此代码,它可以工作,但是无论如何都会带来一些问题,我将在下面解释。

在创建时,即使我认为应该有一种更干净的方法,它似乎也可以正常工作。

class User < ApplicationRecord
  has_one_attached :avatar

  before_save :resize_avatar_image

  def resize_avatar_image
    filename = avatar.filename.to_s
    puts attachment_path = "#{Dir.tmpdir}/#{avatar.filename}"
    File.open(attachment_path, 'wb') do |file|
       file.write(avatar.download)
       file.close
    end
    image = MiniMagick::Image.open(attachment_path)
    # if image.width ...
    image.resize "40x40"
    image.write attachment_path
    avatar.attach(io: File.open(attachment_path), filename: filename, content_type: "image/jpg")
  end

end


我遇到的可以克服的问题


没有下载到临时文件以便使用MiniMagick处理它,我无法即时应用变体
当进行更新(编辑)时,由于purge和purge_later方法的错误,该过程很慢:[ActiveJob] [ActiveStorage::PurgeJob] [d6a930ee-32cd-45a7-bfb5-72929d79f9bb] Error performing ActiveStorage::PurgeJob (Job ID: d6a930ee-32cd-45a7-bfb5-72929d79f9bb) from Async(default) in 0.33ms: ArgumentError (wrong number of arguments (given 0, expected 1));我找不到解决方法。检查旧的Blob是否已删除。
第2点提到的问题似乎与.attach方法有关。
我只测试了*.jpg*.png
未经生产或远程存储测试

10-06 10:57