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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top