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 只调整了照片的大小,没有对它做任何其他事情,所以我不需要再次转换它。
我正在使用 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 只调整了照片的大小,没有对它做任何其他事情,所以我不需要再次转换它。