获取 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]) %>
我正在尝试获取此变体的 width
和 height
值(因为它们是未知的)以用于 width
和 height
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 #<ActiveStorage::Variant:0x0000000132f782c0>
以上是关于获取 Active Storage 变体的元数据的主要内容,如果未能解决你的问题,请参考以下文章
指定要使用 Google Cloud Storage 通知发布的元数据
(GCS) 查看此对象的元数据所需的其他权限:请求对象所有者授予您“storage.objects.get”权限
如何更改 Active Storage Service url_expires_in 超时?
在 Google Cloud Storage 中设置元数据(从 BigQuery 导出)