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
readonly
Returns the value of attribute root.
Instance Method Summary collapse
- #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:) ⇒ DiskService
constructor
A new instance of DiskService.
-
#path_for(key) ⇒ Object
:nodoc:.
- #upload(key, io, checksum: nil) ⇒ Object
- #url(key, expires_in:, filename:, disposition:, content_type:) ⇒ Object
- #url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) ⇒ Object
Methods inherited from ActiveStorage::Service
build, configure, #open, #update_metadata
Constructor Details
#initialize(root:) ⇒ DiskService
Returns a new instance of DiskService.
14 15 16 |
# File 'lib/active_storage/service/disk_service.rb', line 14 def initialize(root:) @root = root end |
Instance Attribute Details
#root ⇒ Object (readonly)
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
#delete(key) ⇒ Object
50 51 52 53 54 55 56 |
# File 'lib/active_storage/service/disk_service.rb', line 50 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
58 59 60 61 62 63 64 |
# File 'lib/active_storage/service/disk_service.rb', line 58 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
25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/active_storage/service/disk_service.rb', line 25 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
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/active_storage/service/disk_service.rb', line 39 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
66 67 68 69 70 71 72 |
# File 'lib/active_storage/service/disk_service.rb', line 66 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
124 125 126 |
# File 'lib/active_storage/service/disk_service.rb', line 124 def headers_for_direct_upload(key, content_type:, **) { "Content-Type" => content_type } end |
#path_for(key) ⇒ Object
:nodoc:
128 129 130 |
# File 'lib/active_storage/service/disk_service.rb', line 128 def path_for(key) #:nodoc: File.join root, folder_for(key), key end |
#upload(key, io, checksum: nil) ⇒ Object
18 19 20 21 22 23 |
# File 'lib/active_storage/service/disk_service.rb', line 18 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(key, expires_in:, filename:, disposition:, content_type:) ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/active_storage/service/disk_service.rb', line 74 def url(key, expires_in:, filename:, disposition:, content_type:) instrument :url, key: key do |payload| content_disposition = content_disposition_with(type: disposition, filename: filename) verified_key_with_expiration = ActiveStorage.verifier.generate( { key: key, disposition: content_disposition, content_type: content_type }, expires_in: expires_in, purpose: :blob_key ) current_uri = URI.parse(current_host) generated_url = url_helpers.rails_disk_service_url(verified_key_with_expiration, protocol: current_uri.scheme, host: current_uri.host, port: current_uri.port, disposition: content_disposition, content_type: content_type, filename: filename ) payload[:url] = generated_url generated_url end end |
#url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/active_storage/service/disk_service.rb', line 103 def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) 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 }, expires_in: expires_in, purpose: :blob_token ) generated_url = url_helpers.update_rails_disk_service_url(verified_token_with_expiration, host: current_host) payload[:url] = generated_url generated_url end end |