Как MediaWiki формирует пути к изображениям?
Вопрос
У меня есть приложение Perl, которое анализирует SQL-таблицы MediaWiki и отображает данные с нескольких вики-страниц.Мне нужно иметь возможность воссоздать абсолютный путь к изображению для отображения изображений, например: .../f/fc/Herbs.jpg/300px-Herbs.jpg
Из руководства MediaWiki:
Изображение_Авторизация:«Путь к [изображению] можно легко вычислить по имени файла и...»
Как рассчитывается путь?
Решение
Один из возможных способов - вычислить подпись MD5 для файла (или идентификатор файла в базе данных), а затем построить / найти путь на основе этого.
Например, скажем, мы получили подпись MD5, например "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
Путь может выглядеть как " / 1f / f " или "/ 1f / ff / 8a"
Причина в том, что вы не хотите, чтобы все файлы находились в 1 папке, и вы хотите иметь возможность " разбивать " их на разных серверах, или в сети 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 .= "/ Один из возможных способов - вычислить подпись MD5 для файла (или идентификатор файла в базе данных), а затем построить / найти путь на основе этого.
Например, скажем, мы получили подпись MD5, например "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
Путь может выглядеть как " / 1f / f " или "/ 1f / ff / 8a"
Причина в том, что вы не хотите, чтобы все файлы находились в 1 папке, и вы хотите иметь возможность " разбивать " их на разных серверах, или в сети 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 "
Затем создайте структуру папок следующим образом:
/
usr/
local/
media/
1f/
f8/
a7/
1ff8a7b5dc7a7d1f0ed65aaa29c04b1e
Структура папок выглядит следующим образом
<*>" } $sig =~ m/^(..)(..)(..)/;
open my $ofh, '>', "$path/$sig"
or die "Cannot open '$path/$sig' for writing: $!";
print $ofh "File contents";
close($ofh);
Структура папок выглядит следующим образом
<*>Другие советы
Принятый ответ неверен:
- Сумма строки MD5 составляет 32 шестнадцатеричных символа (128 бит), а не 16.
- Путь к файлу рассчитывается на основе суммы MD5 имени файла, а не содержимого самого файла.
- Первый каталог в пути — это первый символ, а второй каталог — это первый и второй символы.Путь к каталогу не является комбинацией первых 3 или 6 символов.
Сумма MD5 файла «Herbs.jpg» равна fceaa5e7250d5036ad8cede5ce7d32d6.Первые два символа — «fc», обозначающие путь к файлу f/fc/, как показано в примере.
В PHP вы можете вызвать следующую функцию, чтобы получить URL. Возможно, вы захотите взглянуть на код php, чтобы понять, как они вычисляют путь.
$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL();
Я создал небольшой сценарий Bash под названием reorder.sh , который перемещает файлы изнутри " images " в определенные подпапки:
#!/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