aboutsummaryrefslogtreecommitdiffstats
path: root/lib/active_file/sites/disk_site.rb
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2017-07-01 00:04:19 +0200
committerDavid Heinemeier Hansson <david@loudthinking.com>2017-07-01 00:04:19 +0200
commitd30231e983c019fbe3fcd6a2a06a461fefa58dab (patch)
treed03f63a354ff22579acc56b932d54bc0102cba55 /lib/active_file/sites/disk_site.rb
parentf3fa8f4b0603fe5ddbf7a6d6ea9692bdb9ffe380 (diff)
downloadrails-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/disk_site.rb')
-rw-r--r--lib/active_file/sites/disk_site.rb53
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