我有一个Perl应用程序,它解析MediaWiki SQL表并显示来自多个wiki页面的数据。我需要能够重新创建绝对图像路径来显示图像,例如:.../f/fc/Herbs.jpg/300px-Herbs.jpg
来自MediaWiki手册:
Image_Authorisation:“[image]路径可以从文件名中轻松计算出来......”
如何计算路径?
答案 0 :(得分:12)
接受的答案不正确:
'Herbs.jpg'的MD5总和是fceaa5e7250d5036ad8cede5ce7d32d6。前两个字符是'fc',给出文件路径f / fc /,这是示例中给出的。
答案 1 :(得分:4)
在PHP中,您可以调用以下函数来获取URL。您可能需要查看php代码以了解它们如何计算路径。
$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL();
答案 2 :(得分:2)
一种可能的方法是计算文件的MD5签名(或数据库中的文件ID),然后根据它建立/找到路径。
例如,假设我们获得了像“1ff8a7b5dc7a7d1f0ed65aaa29c04b1e”这样的MD5签名
路径可能看起来像“/ 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
答案 3 :(得分:0)
我创建了一个名为 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