Как MediaWiki составляет пути к изображениям? - PullRequest
8 голосов
/ 29 октября 2008

У меня есть приложение Perl, которое анализирует таблицы MediaWiki SQL и отображает данные с нескольких вики-страниц. Мне нужно иметь возможность заново создать абсолютный путь к изображению для отображения изображений, например: .../f/fc/Herbs.jpg/300px-Herbs.jpg

Из руководства MediaWiki:

Image_Authorisation: "путь [image] можно легко рассчитать по имени файла и ..."

Как рассчитывается путь?

Ответы [ 4 ]

12 голосов
/ 01 ноября 2008

Принят неправильный ответ:

  • Сумма MD5 строки составляет 32 шестнадцатеричных символа (128 бит), а не 16
  • Путь к файлу рассчитывается из суммы MD5 имени файла, а не содержимого самого файла
  • Первый каталог в пути - это первый символ, а второй каталог - это первый и второй символы. Путь к каталогу не является комбинацией первых 3 или 6 символов.

Сумма MD5 'Herbs.jpg' равна fceaa5e7250d5036ad8cede5ce7d32d6. Первые 2 символа - это «fc», что указывает путь к файлу f / fc /, как указано в примере.

4 голосов
/ 01 ноября 2008

В PHP вы можете вызвать следующую функцию, чтобы получить URL. Возможно, вы захотите взглянуть на код php, чтобы выяснить, как они вычисляют путь.

$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL();
2 голосов
/ 29 октября 2008

Один из возможных способов - вычислить подпись MD5 для файла (или идентификатор файла в базе данных), а затем построить / найти путь на основе этого.

Например, скажем, мы получаем подпись MD5, например "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

Путь может выглядеть как "/ 1f / f" или "/ 1f / ff / 8a"

Причина в том, что вы не хотите, чтобы все файлы находились в одной папке, и вы хотите иметь возможность «разбивать» их на разные серверы, или на SAN, или на что-то другое в одинаковой степени .

Подпись MD5 представляет собой строку из 16 "шестнадцатеричных" символов. Так что наш пример "/ 1f / ff / 8a" дает нам 256 * 256 * 256 папок для хранения файлов. Этого должно быть достаточно для любого:)


Обновление, в связи с популярным спросом:

ПРИМЕЧАНИЕ - Я только что понял, что мы говорим именно о том, как это делает MediaWiki. Это не , теперь MediaWiki делает это, но другой способ, которым это могло бы быть сделано .

Под «подписью MD5» я имею в виду делать что-то вроде этого (примеры кода на Perl):

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

$ sig теперь состоит из 32 буквенно-цифровых символов: "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

Затем создайте структуру папок следующим образом:

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

Структура папок выглядит как

/
  usr/
    local/
      media/
        1f/
          f8/
            a7/
              1ff8a7b5dc7a7d1f0ed65aaa29c04b1e
0 голосов
/ 07 марта 2016

Я создал небольшой Bash-скрипт с именем reorder.sh , который перемещает файлы из «изображений» в определенные подпапки:

#!/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
...