Вопрос

У меня есть приложение 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top