Как MediaWiki составляет пути Изображения?

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

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

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

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

4 ответов


одним из возможных способов было бы вычислить подпись 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 .= "/$_" } $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

принятый ответ неверен:

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

сумма MD5 Трав.формат JPG-это fceaa5e7250d5036ad8cede5ce7d32d6. Первые 2 символа - "fc", дающие путь к файлу f/fc/, который приведен в Примере.


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

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

Я создал небольшой скрипт 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