跳至内容 跳至搜索

Active Storage 预览

某些非图像 blob 可以进行预览:即可以作为图像呈现。视频 blob 可以通过提取其第一帧进行预览,而 PDF blob 可以通过提取其第一页进行预览。

预览器从 blob 中提取预览图像。Active Storage 为视频和 PDF 提供预览器。 ActiveStorage::Previewer::VideoPreviewer 用于视频,而 ActiveStorage::Previewer::PopplerPDFPreviewerActiveStorage::Previewer::MuPDFPreviewer 用于 PDF。通过子类化 ActiveStorage::Previewer 并实现必要的​​方法来构建自定义预览器。有关预览器所需内容的更多详细信息,请参阅 ActiveStorage::Previewer 文档。

为了选择 blob 的预览器,Active Storage 按顺序调用每个已注册预览器的 accept? 方法。它使用第一个 accept? 方法返回 true(当给出 blob 时)的预览器。在 Rails 应用程序中,通过在初始化器中操作 Rails.application.config.active_storage.previewers 来添加或删除预览器

Rails.application.config.active_storage.previewers
# => [ ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer ]

# Add a custom previewer for Microsoft Office documents:
Rails.application.config.active_storage.previewers << DOCXPreviewer
# => [ ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer, DOCXPreviewer ]

在 Rails 应用程序之外,请改为修改 ActiveStorage.previewers

内置预览器依赖于第三方系统库。具体来说,内置视频预览器需要 FFmpeg。提供了两个 PDF 预览器:一个需要 Poppler,另一个需要 muPDF(版本 1.8 或更高版本)。要预览 PDF,请安装 Poppler 或 muPDF。

这些库不由 Rails 提供。您必须自己安装它们才能使用内置预览器。在安装和使用第三方软件之前,请确保您了解这样做的许可证含义。

命名空间
方法
D
I
K
N
P
U

属性

[R] blob
[R] variation

类公共方法

new(blob, variation_or_variation_key)

# File activestorage/app/models/active_storage/preview.rb, line 42
def initialize(blob, variation_or_variation_key)
  @blob, @variation = blob, ActiveStorage::Variation.wrap(variation_or_variation_key)
end

实例公共方法

download(&block)

下载与此预览变体相关联的文件。如果没有给出块,则整个文件将被读入内存并返回。对于非常大的文件,这将使用大量的 RAM。如果给出了块,则下载将被流式传输并按块生成。如果预览尚未处理,则会引发 ActiveStorage::Preview::UnprocessedError

# File activestorage/app/models/active_storage/preview.rb, line 90
def download(&block)
  if processed?
    presentation.download(&block)
  else
    raise UnprocessedError
  end
end

image()

返回 blob 附加的预览图像。

# File activestorage/app/models/active_storage/preview.rb, line 59
def image
  blob.preview_image
end

key()

返回 blob 和变体的组合键,它们共同标识特定变体。

# File activestorage/app/models/active_storage/preview.rb, line 77
def key
  if processed?
    presentation.key
  else
    raise UnprocessedError
  end
end

processed()

如果预览尚未处理,则处理预览。为了方便起见,返回接收的 ActiveStorage::Preview 实例

blob.preview(resize_to_limit: [100, 100]).processed.url

处理预览会从其 blob 生成图像并将预览图像附加到 blob。由于预览图像与 blob 一起存储,因此它只生成一次。

# File activestorage/app/models/active_storage/preview.rb, line 52
def processed
  process unless processed?
  variant.processed if variant?
  self
end

url(**options)

返回服务上预览变体的 URL。如果预览尚未处理,则会引发 ActiveStorage::Preview::UnprocessedError

此方法同步处理预览图像的变体,因此不要在视图中调用它。相反,生成一个稳定 URL,该 URL 重定向到此方法返回的 URL。

# File activestorage/app/models/active_storage/preview.rb, line 68
def url(**options)
  if processed?
    presentation.url(**options)
  else
    raise UnprocessedError
  end
end