Webseite mit sehr vielen Bildern, Audio-Dateien und Videos sollten nicht alle hochgeladenen Medien in ein Verzeichnis legen …sonst mag *nix bald nicht mehr ;-)

Hier meine verwendete Lösung, ausgelagert in lib/hashed_dir_structure.rb

module HashedDirStructure

  #p_filename md5 encrypted or number
  def HashedDirStructure.get_path_for_save(p_base_path, p_filename)

    if( p_filename.to_s.length != 32)
      p_filename = ("%05d" % p_filename)
    end

    part16 = p_filename[0..1]
    part256 = p_filename[2..4]

    path = File.join(p_base_path, part16, part256)

    # ensure the directory exists...
    FileUtils.mkdir_p(path)

    return File.join(p_base_path, part16, part256)
  end

  def HashedDirStructure.get_path_for_url(p_filename)

    if( p_filename.to_s.length != 32)
      p_filename = ("%05d" % p_filename)
    end

    part16 = p_filename[0..1]
    part256 = p_filename[2..4]

    return File.join(part16, part256)
  end

end

Verwendung:

Jedes Bild/Audio/Video ist als Medien-Objekt in der DB vorhanden. Diesen Objekten ist jeweils eine Public-ID zugewiesen, was ein MD5-Hash ist.

class Media < ActiveRecord::Base
  require 'digest/md5'

  # setzen der public_id
  # z. B. 6e374ca829eaead5090f6cdd26c08017
  def set_public_id
    self.public_id = Digest::MD5.hexdigest(rand.to_s)
  end

  def save
    # hashed_path hat z. B. folgenden Inhalt
    # "/www/medias/6e/374"
    hashed_path =" HashedDirStructure.get_path_for_save("/www/medias", self.public_id)

    # absoluter Dateiname zum speichern
    # "/www/medias/6e/374/6e374ca829eaead5090f6cdd26c08017.jpg"
    filepath = "#{hashed_path}/#{self.public_id}.jpg"

    #...jetzt kann das speichern beginnen
  end
end

Die Verzeichnisstruktur sieht dann wie folgt aus.

/www/medias
          /6e
          /...
          /6e/374
          /6e/7c0
          /6e/...
          /6e/374/6e374ca829eaead5090f6cdd26c08017.jpg

Links:

Trackback

only 1 comment untill now

  1. [...] Paperclip includes the option for id_partition, but I prefer an hashed stucture (descriped in my first blog). [...]

Add your comment now

Switch to our mobile site