跳至内容 跳至搜索

Active Storage 服务

作为具体服务接口的抽象类。

可用的服务是

  • Disk,用于管理直接保存在硬盘上的附件。

  • GCS,用于通过 Google Cloud Storage 管理附件。

  • S3,用于通过 Amazon S3 管理附件。

  • AzureStorage,用于通过 Microsoft Azure Storage 管理附件。

  • Mirror,能够使用多种服务来管理附件。

在 Rails 应用程序中,您可以通过生成的 config/storage.yml 文件设置您的服务,并在 service 键下引用上述常量之一。例如

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

您可以查看服务的构造函数以了解哪些键是必需的。

然后,在应用程序的配置中,您可以像这样指定要使用的服务

config.active_storage.service = :local

如果您在 Ruby on Rails 应用程序之外使用 Active Storage,您可以像这样配置要使用的服务

ActiveStorage::Blob.service = ActiveStorage::Service.configure(
  :local,
  { local: {service: "Disk",  root: Pathname("/tmp/foo/storage") } }
)
命名空间
方法
C
D
E
H
O
P
U

属性

[RW] name

类公共方法

configure(service_name, configurations)

根据一组配置(通常从 YAML 文件加载)按名称配置 Active Storage 服务。Active Storage 引擎使用此方法在应用程序启动时设置全局 Active Storage 服务。

# File activestorage/lib/active_storage/service.rb, line 52
def configure(service_name, configurations)
  Configurator.build(service_name, configurations)
end

实例公共方法

compose(source_keys, destination_key, filename: nil, content_type: nil, disposition: nil, custom_metadata: {})

将多个文件合并成一个“组合”文件。

# File activestorage/lib/active_storage/service.rb, line 96
def compose(source_keys, destination_key, filename: nil, content_type: nil, disposition: nil, custom_metadata: {})
  raise NotImplementedError
end

delete(key)

删除 key 处的文件。

# File activestorage/lib/active_storage/service.rb, line 101
def delete(key)
  raise NotImplementedError
end

delete_prefixed(prefix)

删除以 prefix 开头的键处的文件。

# File activestorage/lib/active_storage/service.rb, line 106
def delete_prefixed(prefix)
  raise NotImplementedError
end

download(key)

返回 key 处文件的原始内容。

# File activestorage/lib/active_storage/service.rb, line 82
def download(key)
  raise NotImplementedError
end

download_chunk(key, range)

返回 key 处文件在字节 range 范围内的部分内容。

# File activestorage/lib/active_storage/service.rb, line 87
def download_chunk(key, range)
  raise NotImplementedError
end

exist?(key)

如果 key 处存在文件,则返回 true

# File activestorage/lib/active_storage/service.rb, line 111
def exist?(key)
  raise NotImplementedError
end

headers_for_direct_upload(key, filename:, content_type:, content_length:, checksum:, custom_metadata: {})

返回一个 哈希,其中包含 url_for_direct_upload 请求的标头。

# File activestorage/lib/active_storage/service.rb, line 143
def headers_for_direct_upload(key, filename:, content_type:, content_length:, checksum:, custom_metadata: {})
  {}
end

open(*args, **options, &block)

# File activestorage/lib/active_storage/service.rb, line 91
def open(*args, **options, &block)
  ActiveStorage::Downloader.new(self).open(*args, **options, &block)
end

public?()

# File activestorage/lib/active_storage/service.rb, line 147
def public?
  @public
end

update_metadata(key, **metadata)

更新服务中由 key 标识的文件的元数据。仅在服务需要存储必须在识别后更新的特定元数据时才在子类中覆盖。

# File activestorage/lib/active_storage/service.rb, line 78
def update_metadata(key, **metadata)
end

upload(key, io, checksum: nil, **options)

io 上传到指定的 key。如果提供了 checksum,服务将确保在上传完成后匹配,否则将引发 ActiveStorage::IntegrityError.

# File activestorage/lib/active_storage/service.rb, line 71
def upload(key, io, checksum: nil, **options)
  raise NotImplementedError
end

url(key, **options)

返回 key 处文件的 URL。这将为公共文件返回永久 URL,并为私有文件返回短期 URL。对于私有文件,您可以提供 disposition (:inline:attachment)、filenamecontent_type,您希望在请求时使用这些文件来提供服务。此外,您还可以提供 URL 有效的秒数,在 expires_in 中指定。

# File activestorage/lib/active_storage/service.rb, line 119
def url(key, **options)
  instrument :url, key: key do |payload|
    generated_url =
      if public?
        public_url(key, **options)
      else
        private_url(key, **options)
      end

    payload[:url] = generated_url

    generated_url
  end
end

url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {})

返回一个签名的临时 URL,可以直接将上传文件 PUT 到 key 处。该 URL 在 expires_in 中指定的秒数内有效。您还必须提供将要上传的文件的 content_typecontent_lengthchecksum。上传时,服务将验证所有这些属性。

# File activestorage/lib/active_storage/service.rb, line 138
def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {})
  raise NotImplementedError
end