Active Storage 变体
图像 Blob 可以具有变体,这些变体是应用于原始图像的一组转换的结果。这些变体用于创建缩略图、固定大小的头像或原始图像的任何其他衍生图像。
变体依赖于 ImageProcessing gem 来进行实际的文件转换,因此如果您希望使用变体,则必须在您的 Gemfile 中添加 gem "image_processing"
。默认情况下,图像将使用 ImageMagick 使用 MiniMagick gem 进行处理,但您也可以切换到由 ruby-vips gem 操作的 libvips 处理器。
Rails.application.config.active_storage.variant_processor
# => :mini_magick
Rails.application.config.active_storage.variant_processor = :vips
# => :vips
请注意,要创建变体,必须从服务中下载整个 Blob 文件。由于此过程,您还需要考虑何时实际处理变体。例如,您不应该在模板中内联处理变体。将处理延迟到按需控制器,例如 ActiveStorage::RepresentationsController 中提供的控制器。
要引用这种延迟的按需变体,只需通过 Active Storage 提供的已解析路由链接到变体,如下所示
<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>
这将为该特定 Blob 创建一个具有该特定变体的 URL,然后 ActiveStorage::RepresentationsController 可以按需生成该 URL。
当您确实想要生成所需的变体时,请调用 processed
。这将检查变体是否已处理并上传到服务,如果是,则只返回该变体。否则,它将执行转换,将变体上传到服务,然后再次返回自身。示例
avatar.variant(resize_to_limit: [100, 100]).processed.url
这将创建并处理头像 Blob 的一个变体,该变体的高度和宽度限制为 100。然后,它将根据 Blob 的派生键和转换将该变体上传到服务。
您可以将任意数量的 ImageMagick/libvips 操作组合到一个变体中,以及 ImageProcessing gem 提供的任何宏(例如 resize_to_limit
)
avatar.variant(resize_to_limit: [800, 800], colourspace: "b-w", rotate: "-90")
访问以下链接以获取可用 ImageProcessing 命令和 ImageMagick/libvips 操作的列表
属性
[R] | blob | |
[R] | variation |
类公共方法
new(blob, variation_or_variation_key) 链接
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 62 def initialize(blob, variation_or_variation_key) @blob, @variation = blob, ActiveStorage::Variation.wrap(variation_or_variation_key) end
实例公共方法
destroy() 链接
从服务中删除变体文件。
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 102 def destroy service.delete(key) end
download(&block) 链接
下载与该变体关联的文件。如果没有提供块,则整个文件将被读入内存并返回。这将为非常大的文件使用大量的内存。如果提供了一个块,那么下载将以块的形式流式传输并生成。
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 88 def download(&block) service.download key, &block end
filename() 链接
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 92 def filename ActiveStorage::Filename.new "#{blob.filename.base}.#{variation.format.downcase}" end
image() 链接
返回接收到的变体。允许 ActiveStorage::Variant
和 ActiveStorage::Preview
实例可互换使用。
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 97 def image self end
key() 链接
返回 Blob 和变体的组合键,它们共同标识特定变体。
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 73 def key "variants/#{blob.key}/#{OpenSSL::Digest::SHA256.hexdigest(variation.key)}" end
processed() 链接
在处理变体实例本身后或在服务上找到现有的处理后返回该实例。
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 67 def processed process unless processed? self end
url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline) 链接
返回服务上 Blob 变体的 URL。有关详细信息,请参阅 {ActiveStorage::Blob#url}。
使用 url_for(variant)
(或隐式形式,例如 link_to variant
或 redirect_to variant
)获取指向 ActiveStorage::RepresentationsController 的变体的稳定 URL,该控制器反过来将使用此 service_call
方法进行重定向。
源代码:显示 | 在 GitHub 上
# File activestorage/app/models/active_storage/variant.rb, line 82 def url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline) service.url key, expires_in: expires_in, disposition: disposition, filename: filename, content_type: content_type end