class ActiveStorage::Service
Abstract class serving as an interface for concrete services.
The available services are:
-
Disk
, to manage attachments saved directly on the hard drive. -
GCS
, to manage attachments through Google Cloud Storage. -
S3
, to manage attachments through Amazon S3. -
AzureStorage
, to manage attachments through Microsoft Azure Storage. -
Mirror
, to be able to use several services to manage attachments.
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 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 47 def configure(service_name, configurations) Configurator.build(service_name, configurations) end
Public Instance Methods
Delete the file at the key
.
# File lib/active_storage/service.rb, line 89 def delete(key) raise NotImplementedError end
Delete files at keys starting with the prefix
.
# File lib/active_storage/service.rb, line 94 def delete_prefixed(prefix) raise NotImplementedError end
Return the content of the file at the key
.
# File lib/active_storage/service.rb, line 75 def download(key) raise NotImplementedError end
Return the partial content in the byte range
of the file at
the key
.
# File lib/active_storage/service.rb, line 80 def download_chunk(key, range) raise NotImplementedError end
Return true
if a file exists at the key
.
# File lib/active_storage/service.rb, line 99 def exist?(key) raise NotImplementedError end
Returns a Hash of headers for url_for_direct_upload
requests.
# File lib/active_storage/service.rb, line 119 def headers_for_direct_upload(key, filename:, content_type:, content_length:, checksum:) {} end
# File lib/active_storage/service.rb, line 84 def open(*args, &block) ActiveStorage::Downloader.new(self).open(*args, &block) end
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 71 def update_metadata(key, **metadata) end
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 64 def upload(key, io, checksum: nil, **options) raise NotImplementedError end
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 106 def url(key, expires_in:, disposition:, filename:, content_type:) raise NotImplementedError end
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 114 def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) raise NotImplementedError end
Private Instance Methods
# File lib/active_storage/service.rb, line 135 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
# File lib/active_storage/service.rb, line 124 def instrument(operation, payload = {}, &block) ActiveSupport::Notifications.instrument( "service_#{operation}.active_storage", payload.merge(service: service_name), &block) end
# File lib/active_storage/service.rb, line 130 def service_name # ActiveStorage::Service::DiskService => Disk self.class.name.split("::").third.remove("Service") end