Como o MediaWiki compor os caminhos de imagem?
Pergunta
Tenho uma aplicação Perl que analisa tabelas MediaWiki SQL e exibe dados a partir de múltiplas páginas wiki. Eu preciso ser capaz de recriar o caminho da imagem absoluta para exibir as imagens, por exemplo: .../f/fc/Herbs.jpg/300px-Herbs.jpg
De MediaWiki Manual:
Image_Authorisation: "o [imagem] caminho pode ser facilmente calculado a partir do nome do arquivo e ..."
Como é o caminho calculado?
Solução
Uma maneira possível seria calcular a assinatura MD5 do arquivo (ou o ID do arquivo em um banco de dados), e em seguida, construir / encontrar o caminho com base nisso.
Por exemplo, digamos que temos uma assinatura MD5 como "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
O caminho pode parecer "/ 1F / f" ou "/ 1F / ff / 8a"
A razão é que você não quer ter todos os arquivos em uma pasta, e você quer ter a capacidade de "partição"-los em diferentes servidores, ou uma SAN ou o que quer de uma forma-igual-espalhar .
A assinatura MD5 é uma seqüência de 16 caracteres "hex". Assim, o nosso exemplo de "/ 1F / ff / 8a" dá-nos 256 * 256 * 256 pastas para armazenar os arquivos Isso deveria ser suficiente para qualquer um:.)
Update, devido à demanda popular:
NOTA - Eu só percebi que estamos a falar especificamente sobre como MediaWiki faz. Esta é não agora MediaWiki faz isso, mas uma outra maneira em que poderia ter sido feito .
Por "assinatura MD5" Quero dizer fazendo algo parecido com isto (exemplos de código em Perl):
use Digest::MD5 'md5_hex';
my $sig = md5_hex( $file->id );
$ sig agora é 32 caracteres alfanuméricos: "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
Em seguida, construir uma estrutura de pastas como este:
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);
Pasta estrutura se parece com
/
usr/
local/
media/
1f/
f8/
a7/
1ff8a7b5dc7a7d1f0ed65aaa29c04b1e
Outras dicas
A resposta aceita é incorreto:
- A soma MD5 de uma cadeia é de 32 caracteres hexadecimais (128 bits), não 16
- O caminho do arquivo é calculado a partir da soma MD5 do arquivo, não o conteúdo do próprio arquivo
- O primeiro diretório no caminho é o primeiro caractere, eo segundo diretório é o primeiro e segundo caracteres. O caminho do diretório não é uma combinação dos primeiros 3 ou 6 caracteres.
A soma MD5 de 'Herbs.jpg' é fceaa5e7250d5036ad8cede5ce7d32d6. Os 2 primeiros caracteres são 'fc', dando o caminho do arquivo f / fc /, que é o que é dado no exemplo.
No PHP você pode chamar a seguinte função para obter o URL. Você pode querer olhar para o código php para descobrir como eles calculam o caminho.
$url = wfFindFile(Title::makeTitle(NS_IMAGE, $fileName))->getURL();
Eu criei um pequeno script Bash chamado reorder.sh , que se move arquivos de "imagens" dentro das sub específica pastas:
#!/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