【问题标题】:Rails Api Save MiniMagick Image to Active StorageRails Api 将 MiniMagick 图像保存到活动存储
【发布时间】:2021-09-02 12:16:13
【问题描述】:

我正在使用 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 中吗?

【问题讨论】:

    标签: ruby-on-rails ruby rails-activestorage minimagick


    【解决方案1】:

    是的,你可以。目前您正在尝试将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
    

    【讨论】:

    • 看起来不错,但我有疑问 - 有没有办法将此 io: StringIO.open(mini_img.to_blob), filename: metadata["baseName"], mime_type: metadata["mimeType"], identify: false 保存到变量中?
    • 第一个选项有效,但是当我尝试使用第二个(额外选项)时出现错误ArgumentError: unknown keyword: :mime_type
    • @N0ne 我的错,它的 :content_type 不是 :mime_type,我更新了我的答案。
    • @N0ne 如果您想使用变量将参数传递给#attach,您可以。只需将参数放在哈希中:args = { io: StringIO.open(mini_img.to_blob), filename: metadata["baseName"], content_type: metadata["mimeType"], identify: false } 并直接传递变量:User.first.attach(args)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多