MediaWiki는 이미지 경로를 어떻게 구성합니까?
문제
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