سؤال

لدي تطبيق Perl الذي يقوم بتحليل جداول MediaWiki SQL ويعرض البيانات من صفحات wiki المتعددة.أحتاج إلى أن أكون قادرًا على إعادة إنشاء مسار الصورة المطلق لعرض الصور، على سبيل المثال: .../f/fc/Herbs.jpg/300px-Herbs.jpg

من دليل ميدياويكي:

ترخيص_الصورة:"يمكن حساب مسار [الصورة] بسهولة من اسم الملف و..."

كيف يتم حساب المسار؟

هل كانت مفيدة؟

المحلول

إحدى الطرق الممكنة هي حساب توقيع MD5 للملف (أو معرف الملف في قاعدة البيانات)، ثم إنشاء/العثور على المسار بناءً على ذلك.

على سبيل المثال، لنفترض أننا حصلنا على توقيع MD5 مثل "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"

قد يبدو المسار بالشكل "/1f/f" أو "/1f/ff/8a"

السبب هو أنك لا تريد أن يكون لديك جميع الملفات في مجلد واحد، وتريد أن يكون لديك القدرة على "تقسيمها" عبر خوادم مختلفة، أو شبكة SAN أو أي شيء آخر بطريقة متساوية التوزيع.

توقيع MD5 عبارة عن سلسلة مكونة من 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 للسلسلة هو 32 حرفًا سداسيًا عشريًا (128 بت)، وليس 16
  • يتم حساب مسار الملف من مجموع MD5 لاسم الملف، وليس من محتويات الملف نفسه
  • الدليل الأول في المسار هو الحرف الأول، والدليل الثاني هو الحرف الأول والثاني.مسار الدليل ليس عبارة عن مجموعة من الأحرف الثلاثة أو الستة الأولى.

مجموع MD5 لـ "Herbs.jpg" هو fceaa5e7250d5036ad8cede5ce7d32d6.أول حرفين هما 'fc'، مما يعطي مسار الملف f/fc/، وهو ما هو موضح في المثال.

في PHP يمكنك استدعاء الدالة التالية للحصول على URL. قد ترغب في النظر في رمز PHP لمعرفة كيفية حساب المسار.

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

وأنا خلقت النصي باش صغير يسمى <م> reorder.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