문제

MediaWiki SQL 테이블을 구문 분석하고 여러 Wiki 페이지의 데이터를 표시하는 Perl 응용 프로그램이 있습니다. 이미지를 표시하려면 절대 이미지 경로를 다시 만들 수 있어야합니다. .../f/fc/Herbs.jpg/300px-Herbs.jpg

MediaWiki 매뉴얼 :

image_authorisation : [이미지] 경로는 파일 이름과 ...에서 쉽게 계산할 수 있습니다."

경로는 어떻게 계산됩니까?

도움이 되었습니까?

해결책

가능한 한 가지 가능한 방법은 파일의 MD5 서명 (또는 데이터베이스의 파일 ID)을 계산 한 다음이를 기반으로 경로를 빌드/찾는 것입니다.

예를 들어, "1ff8a7b5dc7a7d1f0ed65aaaa29c04b1e"와 같은 MD5 서명을받습니다.

경로는 "/1f/f"또는 "/1f/ff/8a"처럼 보일 수 있습니다.

그 이유는 모든 파일을 1 폴더에 갖고 싶지 않으며 다른 서버 또는 SAN 또는 똑같이 스프레드적인 방식으로 "파티를"할 수 있기를 원하기 때문입니다.

MD5 서명은 16 "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

다른 팁

허용 된 답변이 잘못되었습니다.

  • 문자열의 MD5 합은 16이 아닌 32 개의 16 진 문자 (128 비트)입니다.
  • 파일 경로는 파일 자체의 내용이 아닌 파일 이름의 MD5 합에서 계산됩니다.
  • 경로의 첫 번째 디렉토리는 첫 번째 문자이고 두 번째 디렉토리는 첫 번째 및 두 번째 문자입니다. 디렉토리 경로는 처음 3 또는 6 자의 조합이 아닙니다.

'herbs.jpg'의 MD5 합은 fceaa5e7250d5036ad8cede5ce7d32d6입니다. 처음 두 문자는 'fc'이며 파일 경로에 f/fc/를 제공합니다.

PHP에서는 다음 기능을 호출하여 URL을 얻을 수 있습니다. PHP 코드를보고 경로를 계산하는 방법을 알아낼 수 있습니다.

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

나는 작은 bash 스크립트를 만들었습니다 REARDER.SH 내부 "이미지"에서 특정 하위 폴더로 파일을 이동시킵니다.

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