2008-10-29 51 views
8

我有一個Perl應用程序,用於解析MediaWiki SQL表格並顯示來自多個wiki頁面的數據。我需要能夠重新創建的絕對圖像路徑來顯示圖像,例如:.../f/fc/Herbs.jpg/300px-Herbs.jpgMediaWiki如何組成圖像路徑?

從鏈接到MediaWiki手冊:

Image_Authorisation道:「[圖]路徑可以很容易地從文件中計算名稱和...「

如何計算路徑?

回答

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 
+0

這個答案是不正確,每Nohat,以下。 – Rob 2009-01-28 19:38:15

+0

感謝您指出缺乏清晰度。現在修復。 – JDrago 2009-02-02 17:27:20

12

接受的答案不正確:

  • 字符串的MD5總和是32個進制字符(128位),而不是16
  • 文件路徑被從文件名的MD5之和計算,不是文件本身的內容
  • 路徑中的第一個目錄是第一個字符,第二個目錄是第一個和第二個字符。目錄路徑不是前3個或6個字符的組合。

MD5總和'草藥。jpg'是fceaa5e7250d5036ad8cede5ce7d32d6。前兩個字符是'fc',給出了文件路徑f/fc /,這是示例中給出的。

+0

我一直在爲實際服務器路徑絞盡腦汁3天!謝謝你:) – 2010-03-04 22:36:10

4

在PHP中,您可以調用以下函數來獲取URL。你可能想看看php代碼來弄清他們如何計算路徑。

$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL(); 
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