获取 Active Storage 变体的元数据

Posted

技术标签:

【中文标题】获取 Active Storage 变体的元数据【英文标题】:Get metadata of Active Storage variant 【发布时间】:2020-09-05 15:19:22 【问题描述】:

我有一个 Active Storage 图像变体,例如

<%= image_tag model.logo_image.variant(resize_to_fit: [300, 200]) %>

我正在尝试获取此变体的 widthheight 值(因为它们是未知的)以用于 widthheight html 属性。

我预计他们会在这里:

model.logo_image.variant(resize_to_fit: [300, 200]).processed.blob.metadata

但这给了我原始文件的元数据,而不是调整大小的变体,例如

"identified"=>true, "width"=>800, "height"=>174, "analyzed"=>true

如何获取 Active Storage 变体的尺寸?

【问题讨论】:

它似乎被 Rails 维护者视为一个特性。见:github.com/rails/rails/issues/34263 【参考方案1】:

在 Rails 6.1 中,所有变体最终都存储在一个新的模型/数据库表中,每个变体都带有一个 Blob。如果此功能与您相关,请尝试升级。

深入到对象中,您可以找到变体 blob,因此也可以找到元数据!

试试:

model.logo_image.
 variant(resize_to_fit: [300, 200]).
 processed.send(:record).image.blob.metadata

虽然第一次不工作,但第一次调用时,它没有宽度/高度,因为 AnalyzeJob 将异步运行,它会在“稍后”添加宽度/高度,具体取决于您的队列设置。

如果可用,可以添加一个 helper_method 来创建具有宽度、高度的图像:

module ApplicationHelper
  def image_tag_for_attachment_with_dimensions(variant, opts = )
    if variant.processed?
      metadata = variant.processed.send(:record).image.blob.metadata
      if metadata['width']
        opts[:width] = metadata['width']
        opts[:height] = metadata['height']
      end
    end
    image_tag variant, opts
  end
end

# usage: 
= image_tag_for_attachment_with_dimensions model.logo_image.variant(resize_to_fit: [300, 200])

【讨论】:

@AlecRust 没问题!那你能接受答案吗;)? 已接受答案 ? 我做了一些修改。我假设这个元数据现在仅在 Rails 6.1 中可用,因为在数据库中跟踪变体,因为我在 6.0 上到处查看,但它不存在。 variant.processed.send(:record).image.blob.metadata 链可以缩短为variant.processed.send(:record).image.metadata,因为我相信blob 的很多公共方法都委托给image 这不再适用于 6.1.4,提升:undefined method 'record' for #&lt;ActiveStorage::Variant:0x0000000132f782c0&gt;

以上是关于获取 Active Storage 变体的元数据的主要内容,如果未能解决你的问题,请参考以下文章

指定要使用 Google Cloud Storage 通知发布的元数据

(GCS) 查看此对象的元数据所需的其他权限:请求对象所有者授予您“storage.objects.get”权限

如何更改 Active Storage Service url_expires_in 超时?

在 Google Cloud Storage 中设置元数据(从 BigQuery 导出)

如何获取 QMediaPlaylist 中所有媒体的元数据?

在 woocommerce 3 中获取订单项的元数据