Une façon possible serait de calculer la signature MD5 du fichier (ou l'ID du fichier dans une base de données), puis construire/trouver le chemin basé sur cela.
Par exemple, supposons que nous obtenons une signature MD5 comme "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
Le chemin pourrait ressembler à "/ 1f/f" ou "/ 1f/ff/8a"
La raison en est que vous vous ne voulez pas avoir tous les fichiers dans un seul dossier, et vous voulez avoir la possibilité de les "partitionner" sur différents serveurs, ou sur un SAN ou autre, de la même manière.
La signature MD5 est une chaîne de 16 caractères hexadécimaux. Voici donc un exemple de «/1f/ff/8a » nous donne 256 * 256 * 256 dossiers pour stocker les fichiers dans ce devrait être suffisant pour tout le monde :)
mise à jour, en raison de la demande populaire.
NOTE - Je viens de réaliser que nous parlons spécifiquement de la façon dont MediaWiki le fait. C'est pas maintenant MediaWiki le fait, mais une autre façon dont aurait pu être fait.
Par "signature MD5" Je veux dire faire quelque chose comme ça (des exemples de code en Perl):
use Digest::MD5 'md5_hex';
my $sig = md5_hex($file->id);
sig $ est maintenant 32 caractères alphanumériques: "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
ensuite construire une structure de dossiers comme celui-ci:
my $path = '/usr/local/media';
map { mkdir($path, 0666); $path .= "/$_" } $sig =~ m/^(..)(..)(..)/;
open my $ofh, '>', "$path/$sig"
or die "Cannot open '$path/$sig' for writing: $!";
print $ofh "File contents";
close($ofh);
structure de dossier ressemble
/
usr/
local/
media/
1f/
f8/
a7/
1ff8a7b5dc7a7d1f0ed65aaa29c04b1e
Cette réponse est incorrecte, par Nohat, ci-dessous. – Rob
Merci d'avoir signalé le manque de clarté. Fixé maintenant – JDrago