class ActiveStorage::Service

Abstract class serving as an interface for concrete services.

The available services are:

Inside a Rails application, you can set-up your services through the generated config/storage.yml file and reference one of the aforementioned constant under the service key. For example:

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

You can checkout the service's constructor to know which keys are required.

Then, in your application's configuration, you can specify the service to use like this:

config.active_storage.service = :local

If you are using Active Storage outside of a Ruby on Rails application, you can configure the service to use like this:

ActiveStorage::Blob.service = ActiveStorage::Service.configure(
  :Disk,
  root: Pathname("/foo/bar/storage")
)

Public Class Methods

configure(service_name, configurations) click to toggle source

Configure an Active Storage service by name from a set of configurations, typically loaded from a YAML file. The Active Storage engine uses this to set the global Active Storage service when the app boots.

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

Public Instance Methods

delete(key) click to toggle source

Delete the file at the key.

# File lib/active_storage/service.rb, line 91
def delete(key)
  raise NotImplementedError
end
delete_prefixed(prefix) click to toggle source

Delete files at keys starting with the prefix.

# File lib/active_storage/service.rb, line 96
def delete_prefixed(prefix)
  raise NotImplementedError
end
download(key) click to toggle source

Return the content of the file at the key.

# File lib/active_storage/service.rb, line 77
def download(key)
  raise NotImplementedError
end
download_chunk(key, range) click to toggle source

Return the partial content in the byte range of the file at the key.

# File lib/active_storage/service.rb, line 82
def download_chunk(key, range)
  raise NotImplementedError
end
exist?(key) click to toggle source

Return true if a file exists at the key.

# File lib/active_storage/service.rb, line 101
def exist?(key)
  raise NotImplementedError
end
headers_for_direct_upload(key, filename:, content_type:, content_length:, checksum:) click to toggle source

Returns a Hash of headers for url_for_direct_upload requests.

# File lib/active_storage/service.rb, line 121
def headers_for_direct_upload(key, filename:, content_type:, content_length:, checksum:)
  {}
end
open(*args, **options, &block) click to toggle source
# File lib/active_storage/service.rb, line 86
def open(*args, **options, &block)
  ActiveStorage::Downloader.new(self).open(*args, **options, &block)
end
update_metadata(key, **metadata) click to toggle source

Update metadata for the file identified by key in the service. Override in subclasses only if the service needs to store specific metadata that has to be updated upon identification.

# File lib/active_storage/service.rb, line 73
def update_metadata(key, **metadata)
end
upload(key, io, checksum: nil, **options) click to toggle source

Upload the io to the key specified. If a checksum is provided, the service will ensure a match when the upload has completed or raise an ActiveStorage::IntegrityError.

# File lib/active_storage/service.rb, line 66
def upload(key, io, checksum: nil, **options)
  raise NotImplementedError
end
url(key, expires_in:, disposition:, filename:, content_type:) click to toggle source

Returns a signed, temporary URL for the file at the key. The URL will be valid for the amount of seconds specified in expires_in. You must also provide the disposition (:inline or :attachment), filename, and content_type that you wish the file to be served with on request.

# File lib/active_storage/service.rb, line 108
def url(key, expires_in:, disposition:, filename:, content_type:)
  raise NotImplementedError
end
url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) click to toggle source

Returns a signed, temporary URL that a direct upload file can be PUT to on the key. The URL will be valid for the amount of seconds specified in expires_in. You must also provide the content_type, content_length, and checksum of the file that will be uploaded. All these attributes will be validated by the service upon upload.

# File lib/active_storage/service.rb, line 116
def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:)
  raise NotImplementedError
end

Private Instance Methods

content_disposition_with(type: "inline", filename:) click to toggle source
# File lib/active_storage/service.rb, line 137
def content_disposition_with(type: "inline", filename:)
  disposition = (type.to_s.presence_in(%w( attachment inline )) || "inline")
  ActionDispatch::Http::ContentDisposition.format(disposition: disposition, filename: filename.sanitized)
end
instrument(operation, payload = {}, &block) click to toggle source
# File lib/active_storage/service.rb, line 126
def instrument(operation, payload = {}, &block)
  ActiveSupport::Notifications.instrument(
    "service_#{operation}.active_storage",
    payload.merge(service: service_name), &block)
end
service_name() click to toggle source
# File lib/active_storage/service.rb, line 132
def service_name
  # ActiveStorage::Service::DiskService => Disk
  self.class.name.split("::").third.remove("Service")
end