diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-01 00:04:19 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-01 00:04:19 +0200 |
commit | d30231e983c019fbe3fcd6a2a06a461fefa58dab (patch) | |
tree | d03f63a354ff22579acc56b932d54bc0102cba55 /lib/active_file/sites | |
parent | f3fa8f4b0603fe5ddbf7a6d6ea9692bdb9ffe380 (diff) | |
download | rails-d30231e983c019fbe3fcd6a2a06a461fefa58dab.tar.gz rails-d30231e983c019fbe3fcd6a2a06a461fefa58dab.tar.bz2 rails-d30231e983c019fbe3fcd6a2a06a461fefa58dab.zip |
Go with site instead of store
Better fit for upload/download terminology.
Diffstat (limited to 'lib/active_file/sites')
-rw-r--r-- | lib/active_file/sites/disk_site.rb | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/active_file/sites/disk_site.rb b/lib/active_file/sites/disk_site.rb new file mode 100644 index 0000000000..71dc8d078b --- /dev/null +++ b/lib/active_file/sites/disk_site.rb @@ -0,0 +1,53 @@ +class ActiveFile::Sites::DiskSite < ActiveFile::Site + attr_reader :root + + def initialize(root) + @root = root + end + + def upload(key, data) + File.open(make_path_for(key), "wb") do |file| + while chunk = data.read(65536) + file.write(chunk) + end + end + end + + def download(key) + if block_given? + open(key) do |file| + while data = file.read(65536) + yield data + end + end + else + open(key, &:read) + end + end + + def delete(key) + File.delete(path_for(key)) + true + end + + def 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), normalize(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 |