MediaWikiはどのように画像パスを構成しますか?
質問
MediaWiki SQLテーブルを解析し、複数のWikiページのデータを表示するPerlアプリケーションがあります。画像を表示するには、絶対画像パスを再作成できる必要があります。例: ... / f / fc / Herbs.jpg / 300px-Herbs.jpg
MediaWikiマニュアルから:
Image_Authorisation:" [image]パスはファイル名と...から簡単に計算できます..."
パスはどのように計算されますか?
解決
可能な方法の1つは、ファイルのMD5署名(またはデータベース内のファイルID)を計算し、それに基づいてパスを構築/検索することです。
たとえば、" 1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"のようなMD5署名を取得したとします
パスは" / 1f / f"のようになります。または" / 1f / ff / 8a"
その理由は、すべてのファイルを1つのフォルダーに入れたくないので、「パーティション」機能を使用したいからです。異なるサーバー間、またはSANなど、均等に広がる方法でそれらを使用します。
MD5署名は、16個の「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 .= "/可能な方法の1つは、ファイルのMD5署名(またはデータベース内のファイルID)を計算し、それに基づいてパスを構築/検索することです。
たとえば、" 1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"のようなMD5署名を取得したとします
パスは" / 1f / f"のようになります。または" / 1f / ff / 8a"
その理由は、すべてのファイルを1つのフォルダーに入れたくないので、「パーティション」機能を使用したいからです。異なるサーバー間、またはSANなど、均等に広がる方法でそれらを使用します。
MD5署名は、16個の「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合計は16ではなく32の16進文字(128ビット)です
- ファイルパスは、ファイル自体の内容ではなく、ファイル名のMD5合計から計算されます
- パスの最初のディレクトリは最初の文字で、2番目のディレクトリは最初と2番目の文字です。ディレクトリパスは、最初の3文字または6文字の組み合わせではありません。
「Herbs.jpg」のMD5合計はfceaa5e7250d5036ad8cede5ce7d32d6です。最初の2文字は 'fc'であり、ファイルパスf / fc /を示します。これは例で示されています。
PHPでは、次の関数を呼び出してURLを取得できます。 PHPコードを見て、パスの計算方法を理解することをお勧めします。
$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL();
reorder.sh という名前の小さなBashスクリプトを作成しました。このスクリプトは、「イメージ」内からファイルを移動します。特定のサブフォルダへ:
#!/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