2008-10-29 25 views
8

Tengo una aplicación Perl que analiza las tablas SQL de MediaWiki y muestra datos de varias páginas wiki. Tengo que ser capaz de volver a crear la ruta de la imagen absoluta para mostrar las imágenes, por ejemplo: .../f/fc/Herbs.jpg/300px-Herbs.jpg¿Cómo compone MediaWiki las rutas de las imágenes?

De Manual de Usuario:

Image_Authorisation: "la [imagen] ruta se puede calcular fácilmente a partir del archivo nombre y ... "

¿Cómo se calcula la ruta?

Respuesta

2

Una posible forma sería calcular la firma MD5 del archivo (o el ID del archivo en una base de datos), y luego compilar/encontrar la ruta en función de eso.

Por ejemplo, dicen que obtenemos una firma MD5 como "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

El camino puede ser como "/ 1 f/f" o "/ 1f/ff/8a"

La razón es que se no desea tener todos los archivos en 1 carpeta, y desea tener la capacidad de "particionarlos" en diferentes servidores, o una SAN o lo que sea de forma igualmente dispersa.

La firma MD5 es una cadena de 16 caracteres "hexadecimales". Así que nuestro ejemplo de "/ 1f/ff/8a" nos da 256 * 256 * 256 carpetas para almacenar los archivos de esa debería ser suficiente para cualquiera :)


actualización, debido a la demanda popular:.

NOTA - Me acabo de dar cuenta de que estamos hablando específicamente de cómo MediaWiki lo hace. Esto es no ahora MediaWiki lo hace, pero otra forma en la que se pudo haber hecho.

Por "firma MD5" me refiero a hacer algo como esto (ejemplos de código en Perl):

use Digest::MD5 'md5_hex'; 
my $sig = md5_hex($file->id); 

$ SIG es ahora de 32 caracteres alfanuméricos: "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

luego construir una estructura de carpetas como esto:

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); 

estructura de carpetas se parece

/ 
    usr/ 
    local/ 
     media/ 
     1f/ 
      f8/ 
      a7/ 
       1ff8a7b5dc7a7d1f0ed65aaa29c04b1e 
+0

Esta respuesta es incorrecta, por Nohat, a continuación. – Rob

+0

Gracias por señalar la falta de claridad. Corregido ahora. – JDrago

12

La respuesta aceptada es incorrecto:

  • La suma MD5 de una cadena es de 32 caracteres hexadecimales (128 bits), no 16
  • La ruta del archivo se calcula a partir de la suma MD5 del nombre de archivo, no el contenido del archivo en sí
  • El primer directorio en la ruta es el primer carácter, y el segundo es el primer y segundo caracteres. La ruta del directorio no es una combinación de los primeros 3 o 6 caracteres.

La cantidad de MD5 de 'Herbs.jpg 'es fceaa5e7250d5036ad8cede5ce7d32d6. Los primeros 2 caracteres son 'fc', dando a la ruta del archivo f/fc /, que es lo que se da en el ejemplo.

+0

¡He estado analizando mis cerebros para la ruta real del servidor durante 3 días! Gracias hombre :) –

4

En PHP puede llamar a la siguiente función para obtener la URL. Es posible que desee ver el código php para descubrir cómo calculan la ruta.

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

Muchas gracias :) que fue inmensamente útil! –

0

he creado un pequeño script de Bash llamada reorder.sh que se mueve archivos de "imágenes" dentro de las subcarpetas específicas:

#!/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 
Cuestiones relacionadas