我有一个 Perl 应用程序,可以解析 MediaWiki SQL 表并显示来自多个 wiki 页面的数据。我需要能够重新创建绝对图像路径来显示图像,例如: .../f/fc/Herbs.jpg/300px-Herbs.jpg

来自 MediaWiki 手册:

图片_授权:“可以根据文件名轻松计算[图像]路径......”

路径是如何计算的?

有帮助吗?

解决方案

一种可能的方法是计算文件的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 );

$ sig现在是32个字母数字字符长:" 1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

然后构建一个这样的文件夹结构:

my $path = '/usr/local/media';
map { mkdir($path, 0666); $path .= "/

一种可能的方法是计算文件的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 );

$ 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 个字符的组合。

“Herbs.jpg”的 MD5 和为 fceaa5e7250d5036ad8cede5ce7d32d6。前 2 个字符是“fc”,给出文件路径 f/fc/,这就是示例中给出的路径。

在PHP中,您可以调用以下函数来获取URL。您可能需要查看php代码以了解它们如何计算路径。

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

我创建了一个名为 reorder.sh 的小型Bash脚本,它从内部移动文件“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