无法检索 Shrine 元数据
Cannot retrieve Shrine metadata
由于 Paperclip 弃用,我正在从 Paperclip 切换到 Shrine。
在我的模型 Profilepic.rb
文件中,我曾经按如下方式检索图像变体的尺寸:
before_create :save_ratio
def save_ratio
geo = Paperclip::Geometry.from_file(image.queued_for_write[:original])
self.ratio = geo.width / geo.height
end
基本上我是在保存图像的垂直比例。
它与 Paperclip 配合使用效果很好:我抓取了临时图像 queued_for_write
并在保存值之前使用 Paperclip::Geometry
检查了尺寸。
在 Shrine 中,我在上传器中添加了以下内容:
plugin :add_metadata
plugin :store_dimensions
它工作得很好,因为我拥有所有可用信息并且图像已正确上传到 S3。
但是我保存图像比例的新方法不再有效:
after_create :save_ratio
def save_ratio
self.ratio = self.image[:original].width.to_i / self.image[:original].height.to_i
end
我明白了
error undefined method `[]' for
ProfilepicUploader::UploadedFile:0x00007f69a685c750>
然而,在控制台中,创建图像后:
Profilepic.first.image[:original].width.to_i
return 值是否正确。
编辑
我的上传者:
require "image_processing/mini_magick"
class ProfilepicUploader < Shrine
include ImageProcessing::MiniMagick
plugin :processing
plugin :validation_helpers # to validate image data
plugin :versions
plugin :add_metadata
plugin :store_dimensions
Attacher.validate do
validate_max_size 5.megabyte
validate_mime_type_inclusion ['image/jpg', 'image/jpeg', 'image/png']
end
process(:store) do |io, context|
versions = { original: io } # retain original
io.download do |original|
pipeline = ImageProcessing::MiniMagick.source(original)
versions[:editable] = pipeline.resize_to_fit!(700, 700)
versions[:thumbnail] = pipeline.resize_to_fill!(400, 400)
versions[:small] = pipeline.resize_to_fill!(200, 200)
end
versions # return the hash of processed files
end
end
我的模型:
class Profilepic < ApplicationRecord
require "image_processing/mini_magick"
belongs_to :professionnel
before_create :set_hashid
include ProfilepicUploader::Attachment.new(:image) # adds an `image` virtual attribute
include ProfilepicFinalUploader::Attachment.new(:final_image) # adds an `image` virtual attribute
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
after_create :save_ratio_image
private
def save_ratio
self.ratio = self.image[:original].width.to_i / self.image[:original].height.to_i
end
end
我的 2 美分:
如果您使用 Shrine::Attach.promote 在后台处理文件,通过作业或工作人员,versions
元数据可能在那时不可用(after_create 回调时间)。
我不确定解决此问题的最佳方法是什么,但您可以通过上下文访问处于处理阶段的模型 (https://github.com/shrinerb/shrine/blob/v2.16.0/doc/processing.md#processing-on-upload):
class SomeUploader < Shrine
process(:store) do |io, context|
ratio = io.metadata["width"] / io.metadata["height"]
model = context[:record]
model.update(ratio: ratio)
versions = { original: io } # retain original
io.download do |original|
pipeline = ImageProcessing::MiniMagick.source(original)
versions[:small] = pipeline.resize_to_limit!(300, 300)
# ....
end
versions
end
end
Shrine 首先使用缓存文件保存记录,然后再次使用存储的处理文件。您收到错误的原因是因为您的代码首先是 运行 在分配缓存文件时,此时尚未完成任何处理,并且 self.image
是单个上传文件(不是上传文件的哈希值)。
您可能想要的是从 缓存的 文件中提取比率(处理后与 :original
上传的文件相同):
def save_ratio
if image_data_changed? && image_attacher.cached?
self.ratio = image.width.to_f / image.height.to_f
end
end
或者,您可以创建 image_width
和 image_height
列,让 Shrine 使用 width
和 height
元数据自动填充它们,然后稍后在 SQL.
class ProfilepicUploader < Shrine
plugin :metadata_attributes, width: :width, height: height
end
如其他答案的评论中所述,您还可以使用 JSONB 列作为附件列,这样您就可以使用 SQL 获取 width
& height
元数据作为嗯
由于 Paperclip 弃用,我正在从 Paperclip 切换到 Shrine。
在我的模型 Profilepic.rb
文件中,我曾经按如下方式检索图像变体的尺寸:
before_create :save_ratio
def save_ratio
geo = Paperclip::Geometry.from_file(image.queued_for_write[:original])
self.ratio = geo.width / geo.height
end
基本上我是在保存图像的垂直比例。
它与 Paperclip 配合使用效果很好:我抓取了临时图像 queued_for_write
并在保存值之前使用 Paperclip::Geometry
检查了尺寸。
在 Shrine 中,我在上传器中添加了以下内容:
plugin :add_metadata
plugin :store_dimensions
它工作得很好,因为我拥有所有可用信息并且图像已正确上传到 S3。
但是我保存图像比例的新方法不再有效:
after_create :save_ratio
def save_ratio
self.ratio = self.image[:original].width.to_i / self.image[:original].height.to_i
end
我明白了
error undefined method `[]' for ProfilepicUploader::UploadedFile:0x00007f69a685c750>
然而,在控制台中,创建图像后:
Profilepic.first.image[:original].width.to_i
return 值是否正确。
编辑
我的上传者:
require "image_processing/mini_magick"
class ProfilepicUploader < Shrine
include ImageProcessing::MiniMagick
plugin :processing
plugin :validation_helpers # to validate image data
plugin :versions
plugin :add_metadata
plugin :store_dimensions
Attacher.validate do
validate_max_size 5.megabyte
validate_mime_type_inclusion ['image/jpg', 'image/jpeg', 'image/png']
end
process(:store) do |io, context|
versions = { original: io } # retain original
io.download do |original|
pipeline = ImageProcessing::MiniMagick.source(original)
versions[:editable] = pipeline.resize_to_fit!(700, 700)
versions[:thumbnail] = pipeline.resize_to_fill!(400, 400)
versions[:small] = pipeline.resize_to_fill!(200, 200)
end
versions # return the hash of processed files
end
end
我的模型:
class Profilepic < ApplicationRecord
require "image_processing/mini_magick"
belongs_to :professionnel
before_create :set_hashid
include ProfilepicUploader::Attachment.new(:image) # adds an `image` virtual attribute
include ProfilepicFinalUploader::Attachment.new(:final_image) # adds an `image` virtual attribute
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
after_create :save_ratio_image
private
def save_ratio
self.ratio = self.image[:original].width.to_i / self.image[:original].height.to_i
end
end
我的 2 美分:
如果您使用 Shrine::Attach.promote 在后台处理文件,通过作业或工作人员,versions
元数据可能在那时不可用(after_create 回调时间)。
我不确定解决此问题的最佳方法是什么,但您可以通过上下文访问处于处理阶段的模型 (https://github.com/shrinerb/shrine/blob/v2.16.0/doc/processing.md#processing-on-upload):
class SomeUploader < Shrine
process(:store) do |io, context|
ratio = io.metadata["width"] / io.metadata["height"]
model = context[:record]
model.update(ratio: ratio)
versions = { original: io } # retain original
io.download do |original|
pipeline = ImageProcessing::MiniMagick.source(original)
versions[:small] = pipeline.resize_to_limit!(300, 300)
# ....
end
versions
end
end
Shrine 首先使用缓存文件保存记录,然后再次使用存储的处理文件。您收到错误的原因是因为您的代码首先是 运行 在分配缓存文件时,此时尚未完成任何处理,并且 self.image
是单个上传文件(不是上传文件的哈希值)。
您可能想要的是从 缓存的 文件中提取比率(处理后与 :original
上传的文件相同):
def save_ratio
if image_data_changed? && image_attacher.cached?
self.ratio = image.width.to_f / image.height.to_f
end
end
或者,您可以创建 image_width
和 image_height
列,让 Shrine 使用 width
和 height
元数据自动填充它们,然后稍后在 SQL.
class ProfilepicUploader < Shrine
plugin :metadata_attributes, width: :width, height: height
end
如其他答案的评论中所述,您还可以使用 JSONB 列作为附件列,这样您就可以使用 SQL 获取 width
& height
元数据作为嗯