Class: ActiveStorage::Service::DiskService
- Inherits:
-
ActiveStorage::Service
- Object
- ActiveStorage::Service
- ActiveStorage::Service::DiskService
- Defined in:
- lib/active_storage/service/disk_service.rb
Overview
Wraps a local disk path as an Active Storage service. See ActiveStorage::Service for the generic API documentation that applies to all services.
Instance Attribute Summary collapse
-
#root ⇒ Object
Returns the value of attribute root.
Attributes inherited from ActiveStorage::Service
Instance Method Summary collapse
- #compose(source_keys, destination_key) ⇒ Object
- #delete(key) ⇒ Object
- #delete_prefixed(prefix) ⇒ Object
- #download(key, &block) ⇒ Object
- #download_chunk(key, range) ⇒ Object
- #exist?(key) ⇒ Boolean
- #headers_for_direct_upload(key, content_type:) ⇒ Object
-
#initialize(root:, public: false, **options) ⇒ DiskService
constructor
A new instance of DiskService.
-
#path_for(key) ⇒ Object
:nodoc:.
- #upload(key, io, checksum: nil) ⇒ Object
- #url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {}) ⇒ Object
Methods inherited from ActiveStorage::Service
build, configure, #open, #public?, #update_metadata, #url
Constructor Details
#initialize(root:, public: false, **options) ⇒ DiskService
Returns a new instance of DiskService.
14 15 16 17 |
# File 'lib/active_storage/service/disk_service.rb', line 14 def initialize(root:, public: false, **) @root = root @public = public end |
Instance Attribute Details
#root ⇒ Object
Returns the value of attribute root.
12 13 14 |
# File 'lib/active_storage/service/disk_service.rb', line 12 def root @root end |
Instance Method Details
#compose(source_keys, destination_key) ⇒ Object
[View source]
103 104 105 106 107 108 109 110 111 |
# File 'lib/active_storage/service/disk_service.rb', line 103 def compose(source_keys, destination_key, **) File.open(make_path_for(destination_key), "w") do |destination_file| source_keys.each do |source_key| File.open(path_for(source_key), "rb") do |source_file| IO.copy_stream(source_file, destination_file) end end end end |
#delete(key) ⇒ Object
[View source]
51 52 53 54 55 56 57 |
# File 'lib/active_storage/service/disk_service.rb', line 51 def delete(key) instrument :delete, key: key do File.delete path_for(key) rescue Errno::ENOENT # Ignore files already deleted end end |
#delete_prefixed(prefix) ⇒ Object
[View source]
59 60 61 62 63 64 65 |
# File 'lib/active_storage/service/disk_service.rb', line 59 def delete_prefixed(prefix) instrument :delete_prefixed, prefix: prefix do Dir.glob(path_for("#{prefix}*")).each do |path| FileUtils.rm_rf(path) end end end |
#download(key, &block) ⇒ Object
[View source]
26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/active_storage/service/disk_service.rb', line 26 def download(key, &block) if block_given? instrument :streaming_download, key: key do stream key, &block end else instrument :download, key: key do File.binread path_for(key) rescue Errno::ENOENT raise ActiveStorage::FileNotFoundError end end end |
#download_chunk(key, range) ⇒ Object
[View source]
40 41 42 43 44 45 46 47 48 49 |
# File 'lib/active_storage/service/disk_service.rb', line 40 def download_chunk(key, range) instrument :download_chunk, key: key, range: range do File.open(path_for(key), "rb") do |file| file.seek range.begin file.read range.size end rescue Errno::ENOENT raise ActiveStorage::FileNotFoundError end end |
#exist?(key) ⇒ Boolean
67 68 69 70 71 72 73 |
# File 'lib/active_storage/service/disk_service.rb', line 67 def exist?(key) instrument :exist, key: key do |payload| answer = File.exist? path_for(key) payload[:exist] = answer answer end end |
#headers_for_direct_upload(key, content_type:) ⇒ Object
[View source]
95 96 97 |
# File 'lib/active_storage/service/disk_service.rb', line 95 def headers_for_direct_upload(key, content_type:, **) { "Content-Type" => content_type } end |
#path_for(key) ⇒ Object
:nodoc:
99 100 101 |
# File 'lib/active_storage/service/disk_service.rb', line 99 def path_for(key) # :nodoc: File.join root, folder_for(key), key end |
#upload(key, io, checksum: nil) ⇒ Object
[View source]
19 20 21 22 23 24 |
# File 'lib/active_storage/service/disk_service.rb', line 19 def upload(key, io, checksum: nil, **) instrument :upload, key: key, checksum: checksum do IO.copy_stream(io, make_path_for(key)) ensure_integrity_of(key, checksum) if checksum end end |
#url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {}) ⇒ Object
[View source]
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/active_storage/service/disk_service.rb', line 75 def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {}) instrument :url, key: key do |payload| verified_token_with_expiration = ActiveStorage.verifier.generate( { key: key, content_type: content_type, content_length: content_length, checksum: checksum, service_name: name }, expires_in: expires_in, purpose: :blob_token ) url_helpers.update_rails_disk_service_url(verified_token_with_expiration, ).tap do |generated_url| payload[:url] = generated_url end end end |