Frage

Ich habe eine Perl-Anwendung, die MediaWiki SQL-Tabellen und Anzeigen von Daten aus mehreren Wiki-Seiten analysiert. Ich muß in der Lage sein, den absoluten Bildpfad neu zu erstellen, um die Bilder anzuzeigen, zB: .../f/fc/Herbs.jpg/300px-Herbs.jpg

Von MediaWiki Handbuch:

  

Image_Authorisation: „Der [Bild] Pfad leicht aus dem Dateinamen berechnet werden kann und ...“

Wie wird der Weg berechnet?

War es hilfreich?

Lösung

Eine Möglichkeit wäre, die MD5-Signatur der Datei (oder die Datei-ID in einer Datenbank), zu berechnen und dann bauen / findet den Weg auf der Grundlage dieser.

Zum Beispiel, sagen wir eine MD5-Signatur wie "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e" get

Der Weg könnte so aussehen "/ 1f / f" oder "/ 1f / ff / 8a"

Der Grund dafür ist, dass Sie nicht alle Dateien in 1 Ordner haben wollen, und Sie wollen die Möglichkeit haben, auf „Partition“, um sie auf verschiedene Server oder ein SAN oder was auch immer in einem gleich spread-out Weg .

Die MD5-Signatur ist eine Kette von 16 „hex“ Zeichen. So ist unser Beispiel "/ 1f / ff / 8a" gibt uns 256 * 256 * 256 Ordner in die Dateien zu speichern Das sollte für jeden genug sein.)


Update, wegen der großen Nachfrage:

Hinweis - Ich habe gerade realisiert sprechen wir speziell darüber, wie MediaWiki es tut. Dies ist nicht jetzt MediaWiki tut es, aber eine andere Art und Weise, in der es hätte getan werden können .

Mit dem "MD5-Signatur" Ich meine, so etwas wie dies zu tun (Code-Beispiele in Perl):

use Digest::MD5 'md5_hex';
my $sig = md5_hex( $file->id );

$ sig ist jetzt 32 alphanumerische Zeichen lang: "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

Dann eine Ordnerstruktur wie folgt erstellen:

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);

Ordnerstruktur sieht aus wie

/
  usr/
    local/
      media/
        1f/
          f8/
            a7/
              1ff8a7b5dc7a7d1f0ed65aaa29c04b1e

Andere Tipps

Die akzeptierte Antwort ist falsch:

  • The MD5 Summe einer Zeichenfolge 32 Hexadezimalzeichen (128 Bits), nicht 16
  • Der Dateipfad wird von der MD5-Summe des Dateinamen berechnet, nicht der Inhalt der Datei selbst
  • Das erste Verzeichnis im Pfad ist das erste Zeichen, und das zweite Verzeichnis ist das erste und die zweite Zeichen. Der Verzeichnispfad ist nicht eine Kombination aus den ersten 3 oder 6 Zeichen.

Die MD5-Summe von 'Herbs.jpg' ist fceaa5e7250d5036ad8cede5ce7d32d6. Die ersten zwei Zeichen sind ‚fc‘, die f / fc / Dateipfad geben, das ist das, was in dem Beispiel gegeben wird.

In PHP können Sie die folgende Funktion aufrufen, die URL zu erhalten. Sie können an dem PHP-Code aussehen wollen, um herauszufinden, wie sie den Weg berechnen.

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

Ich habe ein kleines Bash-Skript namens reorder.sh , welche Dateien von innen „Bilder“ auf die spezifischen Unterordnern bewegt:

#!/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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top