diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-04 16:44:50 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-04 16:44:50 +0200 |
commit | efd950ae706cfbb55dffebd5d0c85e30acfd7a45 (patch) | |
tree | 49830af75a1fc0a0ec2c634f060fb984908a7e38 /lib/active_file/site/disk_site.rb | |
parent | ccaba581c0cf8653f61ce212667eaa1cc6f0a28e (diff) | |
download | rails-efd950ae706cfbb55dffebd5d0c85e30acfd7a45.tar.gz rails-efd950ae706cfbb55dffebd5d0c85e30acfd7a45.tar.bz2 rails-efd950ae706cfbb55dffebd5d0c85e30acfd7a45.zip |
Use lazy-loaded factory method for site configuration
Diffstat (limited to 'lib/active_file/site/disk_site.rb')
-rw-r--r-- | lib/active_file/site/disk_site.rb | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/active_file/site/disk_site.rb b/lib/active_file/site/disk_site.rb new file mode 100644 index 0000000000..1fa77029c7 --- /dev/null +++ b/lib/active_file/site/disk_site.rb @@ -0,0 +1,72 @@ +require "fileutils" +require "pathname" + +class ActiveFile::Site::DiskSite < ActiveFile::Site + attr_reader :root + + def initialize(root:) + @root = root + end + + + def upload(key, io) + File.open(make_path_for(key), "wb") do |file| + while chunk = io.read(65536) + file.write(chunk) + end + end + end + + def download(key) + if block_given? + File.open(path_for(key)) do |file| + while data = file.read(65536) + yield data + end + end + else + File.open path_for(key), &:read + end + end + + def delete(key) + File.delete path_for(key) rescue Errno::ENOENT # Ignore files already deleted + end + + def exist?(key) + File.exist? path_for(key) + end + + + def url(key, disposition:, expires_in: nil) + verified_key_with_expiration = ActiveFile::VerifiedKeyWithExpiration.encode(key, expires_in: expires_in) + + if defined?(Rails) + Rails.application.routes.url_helpers.rails_disk_blob_path(verified_key_with_expiration) + else + "/rails/blobs/#{verified_key_with_expiration}" + end + end + + def byte_size(key) + File.size path_for(key) + end + + def checksum(key) + Digest::MD5.file(path_for(key)).hexdigest + end + + + private + def path_for(key) + File.join root, folder_for(key), key + end + + def folder_for(key) + [ key[0..1], key[2..3] ].join("/") + end + + def make_path_for(key) + path_for(key).tap { |path| FileUtils.mkdir_p File.dirname(path) } + end +end |