Rails Api 将 MiniMagick 图像保存到活动存储

Rails Api Save MiniMagick Image to Active Storage

我正在使用 MiniMagick 调整图像大小。我的方法看起来像这样:

def resize
    mini_img = MiniMagick::Image.new(img.tempfile.path)
    mini_img.combine_options do |c|
      c.resize '50x50^'
      c.gravity 'center'
      c.extent '50x50'
    end

    mini_img
end

调整大小有效,但问题是当我尝试将 mini_img 保存到 Active Storage 时,因为出现错误 Could not find or build blob: expected attachable, got #<MiniMagick::Image。我能否以某种方式将 MiniMagick::Image (mini_img) 转换为普通图像并将其保存到 Active Storage 中?

是的,你可以。目前您正在尝试将 MiniMagick::Image 的实例保存到 ActiveStorage,这就是您收到该错误的原因。相反,您应该将 :io 直接附加到 ActiveStorage。

使用您的示例,如果您想将 mini_img 附加到假设的 User,您可以这样做:

User.first.attach io: StringIO.open(mini_img.to_blob), filename: "filename.extension"

在这个例子中,我在 mini_img 上调用 to_blob,它是 MiniMagick::Image 的一个实例,并将其作为参数传递给 StringIO#open。确保以这种方式附加到 ActiveStorage 时包含 :filename 选项。

额外

由于您在使用 MiniMagick 时已经有了 content_type,您可能希望直接将其提供给 ActiveStorage。

metadata = mini_img.data
User.first.attach io: StringIO.open(mini_img.to_blob), filename: metadata["baseName"], content_type: metadata["mimeType"], identify: false

对于遇到类似问题的人。我只是将方法更改为:

def resize
MiniMagick::Image.new(img.tempfile.path).combine_options do |c|
    c.resize '50x50^'
    c.gravity 'center'
    c.extent '50x50'
  end

  img
end

在这个解决方案中,MiniMagick 只调整了照片的大小,没有对它做任何其他事情,所以我不需要再次转换它。