2008-10-29 5 views
8

J'ai une application Perl qui analyse les tables SQL MediaWiki et affiche les données de plusieurs pages wiki. Je dois être en mesure de recréer le chemin d'image absolue pour afficher les images, par exemple: .../f/fc/Herbs.jpg/300px-Herbs.jpgComment MediaWiki compose-t-il les chemins de l'image?

De Manuel MediaWiki:

Image_Authorisation: « le chemin [image] peut être calculé facilement à partir du fichier nom et ... "

Comment le chemin est-il calculé?

Répondre

2

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 
+0

Cette réponse est incorrecte, par Nohat, ci-dessous. – Rob

+0

Merci d'avoir signalé le manque de clarté. Fixé maintenant – JDrago

12

La réponse acceptée est incorrecte:

  • La somme MD5 d'une chaîne est de 32 caractères hexadécimaux (128 bits), et non pas 16
  • Le chemin du fichier est calculée à partir de la somme de contrôle MD5 du nom de fichier, pas le contenu du fichier lui-même
  • Le premier répertoire du chemin est le premier caractère et le deuxième répertoire est le premier et le deuxième caractères. Le chemin du répertoire n'est pas une combinaison des 3 ou 6 premiers caractères.

La somme MD5 de 'Herbes.jpg 'est fceaa5e7250d5036ad8cede5ce7d32d6. Les 2 premiers caractères sont 'fc', donnant le chemin du fichier f/fc /, qui est ce qui est donné dans l'exemple.

+0

J'avais creusé mes cerveaux pour le chemin actuel du serveur pendant 3 jours maintenant! Merci l'homme :) –

4

En PHP, vous pouvez appeler la fonction suivante pour obtenir l'URL. Vous voudrez peut-être regarder le code PHP pour comprendre comment ils calculent le chemin.

$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL(); 
+0

Merci beaucoup :) qui a été extrêmement utile! –

0

J'ai créé un petit script Bash appelé reorder.sh qui déplace les fichiers de "images" à l'intérieur des sous-dossiers spécifiques:

#!/bin/bash 

cd /opt/mediawiki/mediawiki-cur/images 

for i in `find -maxdepth 1 -type f ! -name .htaccess ! -name README ! -name reorder.sh -printf '%f\n'`; do 
    path1=$(echo -n $i | md5sum | head -c1) && 
    path2=$(echo -n $i | md5sum | head -c2) && 
    mkdir -p $path1/$path2/     && 
    mv $i $path1/$path2/; 
done 
Questions connexes