1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Go with site instead of store

Better fit for upload/download terminology.
This commit is contained in:
David Heinemeier Hansson 2017-07-01 00:04:19 +02:00
parent f3fa8f4b06
commit d30231e983
3 changed files with 68 additions and 3 deletions

View file

@ -1,3 +1,5 @@
require "active_file/site"
# Schema: id, key, filename, content_type, metadata, byte_size, digest, created_at # Schema: id, key, filename, content_type, metadata, byte_size, digest, created_at
class ActiveFile::Blob < ActiveRecord::Base class ActiveFile::Blob < ActiveRecord::Base
self.table_name = "active_file_blobs" self.table_name = "active_file_blobs"
@ -6,7 +8,7 @@ class ActiveFile::Blob < ActiveRecord::Base
store :metadata, coder: JSON store :metadata, coder: JSON
class_attribute :verifier, default: -> { Rails.application.message_verifier('ActiveFile') } class_attribute :verifier, default: -> { Rails.application.message_verifier('ActiveFile') }
class_attribute :storage class_attribute :site
class << self class << self
def find_verified(signed_id) def find_verified(signed_id)
@ -31,7 +33,7 @@ class ActiveFile::Blob < ActiveRecord::Base
end end
def delete def delete
storage.delete token site.delete token
end end
def purge def purge

View file

@ -1,4 +1,7 @@
class ActiveFile::Store class ActiveFile::Site
def initialize
end
def upload(key, data) def upload(key, data)
end end
@ -23,4 +26,11 @@ class ActiveFile::Store
def move(from_key:, to_key:) def move(from_key:, to_key:)
end end
private
def normalize_key(key)
# disallow "." and ".." segments in the key
key.split(%r[/]).reject { |s| s == "." || s == ".." }
end
end end

View file

@ -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