aboutsummaryrefslogblamecommitdiffstats
path: root/lib/active_file/sites/disk_site.rb
blob: 2bf80d07f4d7ce454680f7d9cb9e2c40f4a9d70b (plain) (tree)
1
2
3


                   
















                                                    
                                        




                                     
                                     



                 




                             

     

                    
                           







                                             
                                          


                       
                                        





                                                                       
require "fileutils"
require "pathname"

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?
      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)
  end

  def exists?(key)
    File.exist? path_for(key)
  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