Dec
16
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:

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