Jer*_*ank 8 php perl mediawiki
我有一个Perl应用程序,它解析MediaWiki SQL表并显示来自多个维基页面的数据.我需要能够重新创建绝对图像路径来显示图像,例如:.../f/fc/Herbs.jpg/300px-Herbs.jpg
来自MediaWiki手册:
Image_Authorisation:"[image]路径可以从文件名中轻松计算出来......"
如何计算路径?
noh*_*hat 12
接受的答案是错误的:
'Herbs.jpg'的MD5总和是fceaa5e7250d5036ad8cede5ce7d32d6.前两个字符是'fc',给出文件路径f/fc /,这是示例中给出的.
一种可能的方法是计算文件的 MD5 签名(或数据库中的文件 ID),然后基于该签名构建/查找路径。
例如,假设我们得到一个 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 );
Run Code Online (Sandbox Code Playgroud)
$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);
Run Code Online (Sandbox Code Playgroud)
文件夹结构看起来像
/
usr/
local/
media/
1f/
f8/
a7/
1ff8a7b5dc7a7d1f0ed65aaa29c04b1e
Run Code Online (Sandbox Code Playgroud)