سؤال حول حجم/تغيير حجم رفع الصور

بعد قراءة هذا الموضوع، وهذا الموضوع، وهذا الموضوع، لم أعد متأكدًا تمامًا مما يفعله Discourse مع الصور الكبيرة. كان فهمي السابق هو أنه لا يتم إجراء أي تغيير في الحجم بواسطة البرنامج، بل فقط عبر CSS — أي أن حجم الصورة كان محدودًا بـ maximum image upload size in kB، ونهاية القصة. إذا كانت الصورة الأكبر عبارة عن ملف بعيد، فإنها تُربط فقط، وإلا فلا يمكنك تحميلها.

لكنني الآن مرتبك لأن تلك المواضيع تذكر تصغير الحجم وتحسين الصور، وهو ما لم أكن أظن أنه يحدث لأنني لم أره عمليًا على حد علمي. كما أنني لا أعرف ما الذي ينطبق عليه حد Maximum number of megapixels allowed for an image. هل يمنع هذا تحميل الصور الأكبر من ذلك الحد، أم أن الصور التي تتجاوز هذا الحد يتم تصغير حجمها طالما أنها أقل من max upload size؟

إذا كان الأمر هو الثاني، فلماذا تكون الإعداد الافتراضي للميغابكسل ضخمًا جدًا مقارنة بالإعداد الافتراضي لأقصى حجم للتحميل؟ يبدو غير مرجعٍ للغاية أن يرغب شخص ما في نشر صورة بحجم 51 ميغابكسل وأقل من 4096 كيلوبايت.


ما أريده هو تمكين المستخدمين من تحميل ما لديهم بسهولة دون القلق بشأن أحجام الملفات ودقة الصور، وأن يقوم البرنامج بتقديم نسخة مناسبة لا تُرهق مستخدمي الهواتف أو الأشخاص ذوي الاتصالات الأبطأ. هل هذا ممكن حاليًا بمجرد تعديل max image size وmax megapixels؟

كل هذا يعمل جاهزًا من الصندوق:

انقر بزر الماوس الأيمن على :arrow_double_up: لعرض المصدر، ستجد أن الصورة صغيرة. انقر عليها لترى الصورة بدقة كاملة.

لذا، إذا قمت بتغيير max upload إلى 10 ميجابايت و max megapixel إلى 12، فماذا يحدث عندما يحاول المستخدم رفع صورة بدقة 16 ميجابكيل وحجمها 7 ميجابايت؟

تحت الإعدادات الافتراضية، تكون نسبة كبيرة من الصور التي تلتقطها الهواتف الأحدث أكبر من 4096 كيلوبايت، لكنها لا تقترب أبدًا من 40 ميجابكسل.

ما زلت لا أفهم ما الذي يحدث بالضبط، أو لماذا تم ضبط الافتراضيات على هذه القيم.

أنصحك بتجربة الإعدادات: غيّر إعدادًا ما، ثم ارفع صورة ضخمة، وراقب ما يحدث.

حسناً، يمكنني فعل ذلك. ومع ذلك، أود أيضاً أن أفهم ما يفعله البرنامج فعلياً حتى أتمكن من اتخاذ قرارات أكثر استنارة. خلال الفترة التي استخدمت فيها Discourse، تعلمت احترام الإعدادات الافتراضية وتغييرها فقط عند الضرورة. في هذه الحالة، لا تعمل الإعدادات الافتراضية بشكل جيد لمجتمع نموذجي إلى حد ما، وأنا متشوق لمعرفة سبب تعيينها بهذه الطريقة، وما هي القيم المعقولة التي يجب أن أضعها في اعتباري بدلاً من ذلك، وما الذي سيحدث عند إجراء هذه التغييرات.

عند قراءة الكود، فإن الحد الأقصى للميجابكسل هو قيد صارم. إنه مفتاح أمان وليس شيئًا يستخدمه النظام لاتخاذ قرارات بشأن التصغير التلقائي.

max_image_size_kb هو العامل الوحيد الحاسم في التصغير التلقائي عند الرفع.

ارفع الحد الأقصى للميجابكسل إلى أكبر قيمة ممكنة ترغب في استضافتها على الإطلاق.

بعد الضغط على الأزرار لفترة من الوقت لمحاولة فهم الأمور، هذا ما أعتقد أنه يحدث:

  • مع التثبيت الافتراضي، إذا كانت client_max_body_size تساوي max image size kb، فلن يتم تغيير حجم الصور.

  • زيادة client_max_body_size ستسمح برفع ملفات أكبر، والتي سيقوم Discourse بمحاولة تغيير حجمها ضمن الحد المحدد في max image size kb.

  • على الرغم من أن الوصف يوحي بغير ذلك، فإن max image size kb لا يحد فعليًا من أحجام الرفع (هذا أمر محير للغاية!)

  • أحجام الرفع تُحدد حصريًا عبر client_max_body_size في nginx.

  • عند تغيير الحجم:

    • تبقى ملفات JPEG بصيغة JPEG بنتائج جيدة.
    • تتحول ملفات PNG إلى JPG بنتائج مقبولة.
    • تبقى ملفات GIF المتحركة بصيغة GIF بنتائج ضعيفة بشكل عام.

هل كل هذا صحيح؟ إذا كان الأمر كذلك، فيبدو أن هذا من النوع الذي يجب شرحه بشكل أفضل، لأن التثبيت الجاهز لا يقوم بأي تغيير لحجم الصور على الرغم من أن هذه ميزة قد يريدها الكثير من الناس، وليس واضحًا على الإطلاق من الوثائق المتاحة كيفية تمكينها.

حسناً، لقد راجعت للتو ملف nginx.sample.conf على GitHub ويبدو أن القيمة الافتراضية لـ client_max_body_size أصبحت الآن 10 ميجابايت بدلاً من 4 ميجابايت. هل كان هذا هو الحال دائماً؟ لا أتذكر أنني قمت بتغيير هذا الملف في تثبيتاتي من قبل حتى اليوم.

شكرًا لك على الاختبار الشامل مع الإصدار الحالي. لقد راجعته ويبدو أنه يعمل عمليًا تمامًا كما وصفت.

حجم الجسم الأقصى كان 10 منذ فترة طويلة، ويجب علينا على الأرجح زيادته إلى 20

أتفق على أننا يجب أن نحسن وصف إعدادات الموقع، وسأفعل ذلك لاحقًا اليوم.

تعديل:

تم تحديث الوثائق وفقًا لـ:

https://review.discourse.org/t/doc-improve-documentation-of-image-limit-site-settings/9303

مرحبًا سام، بناءً على الوصف، يبدو أن الأمر لا يعمل بالنسبة لي:

  • max_image_size_kb: “الحد الأقصى لحجم صورة الرفع بوحدة كيلوبايت. يجب تهيئة هذا أيضًا في nginx (client_max_body_size) أو Apache أو الوكيل. سيتم تغيير حجم الصور التي تكون أكبر من هذا الحد وأصغر من client_max_body_size لتناسبها عند الرفع.”
  • max_image_megapixels: “الحد الأقصى لعدد الميجابكسل المسموح به للصورة. سيتم رفض الصور التي تحتوي على عدد ميجابكسل أعلى.”

أو على الأقل لا يبدو أن هناك محاولة لتغيير الحجم.

كانت قيمة max_image_size_kb مضبوطة على 1000kb، وتم استبدال صورة أكبر قليلاً من هذا الحد برابط يتبعه نص يقول (صورة أكبر من 1000KB).

غيّرت الإعداد إلى 500kb وحدث نفس الشيء.

لم أقم بتغيير client_max_body_size في NGINX، وأفترض أنه مضبوط على القيمة الافتراضية (4096).

هذه الصور كانت مرتبطة حرارياً (hot linked) على أي حال، وأفترض أنه إذا كانت خيار تحميل الصور البعيدة إلى المحلي مفعلًا، فيجب أن يُعامل الأمر كرفع عادي؟ (إذا لم يكن كذلك، هل يمكننا جعله يتصرف بنفس الطريقة من فضلك؟)

تعديل: حسنًا، يبدو أن الرفع المباشر وتغيير الحجم يعملان - رائع! إذن المشكلة تكمن فقط في الصور البعيدة التي يتم جلبها. لست متأكدًا من السلوك المثالي في الواقع، لكن عند التفكير الأولي، أعتقد أن الأمر نفسه يجب أن ينطبق - يجب تغيير حجم تلك الصور أيضًا.

أعتقد أن هذا طلب ميزة منفصل. بالتأكيد، إذا قمت بخفض الحد الأقصى لحجم الصورة إلى 200 كيلوبايت، فمن المنطقي تمامًا تغيير حجم الصور المرتبطة مباشرة عند تنزيلها. هناك عتبات تؤثر على القرار، ولا ينبغي لنا تنزيل صورة بحجم 700 جيجابايت فقط من أجل التحقق من ذلك، لكن نعم، يمكن تحسين بعض الأمور.

أتفق معك يا سام. لا أستطيع أن أتخيل أي سبب لعدم رغبتك في أن تتبع الصور المرتبطة مباشرة التي تم تنزيلها نفس القواعد، بصراحة.


كما اكتشفت للتو أنه إذا قمت بتغيير الحد الأقصى لحجم الصورة، فإن ذلك يؤثر فعليًا على حجم الملف الذي تنتهي به؛ وهو أمر رائع حقًا! عند تعيينه على 500 كيلو بايت، انتهى الأمر بإعادة ضبط حجم صورة بحجم 1.2 ميجابايت إلى 360 كيلو بايت، وعند تعيينه على 200 كيلو بايت، كانت النتيجة نفس الملف بحجم 118 كيلو بايت :+1: (على الرغم من أنه بالطبع أصبح أصغر حجمًا أيضًا).

تعديل: آه، لكننا نواجه المشكلة الأصلية مرة أخرى - حيث تفشل الصور التي تكون كبيرة جدًا بحيث لا يمكن إعادة ضبط حجمها بالخطأ:

lib/discourse.rb:57:in `exec': convert: improper image header `/tmp/image20200228-23391-t365z9.jpg' @ error/png.c/ReadPNGImage/4294.

أتساءل ما إذا كان هناك طريقة تجعل DC تقوم دائمًا بإعادة ضبط الحجم؟ حتى لو انتهت الصورة بأن تكون صغيرة جدًا؟


هذا هو الإعداد الافتراضي في منتدياتنا. حاولت تغييره إلى 20000 وقد نجح (أو بدا أنه تم حفظه)، لكن عندما حاولت رفع صورة/GIF بحجم 17.2 ميجابايت، ظهرت لي هذه رسالة الخطأ:


هل يمكنك إخباري بالمسار الذي يجب اتباعه (الأوامر المدخلة) في لينكس لتغيير “client_max_body_size” في nginx؟ أنا أستخدم خادمًا رقميًا من DigitalOcean.

هل يعني هذا أن الإعداد الافتراضي سيُغيّر قريبًا من 4096 إلى 20000؟

رائع يا @riking! شكرًا لك يا صاحبي!

/var/discourse يحتوي فقط على مجلد مشترك. لا يمكنني العثور على الملف الذي تتحدث عنه. مشكلتي هي أن لدي تثبيتًا جديدًا تمامًا لـ Discourse ولا تعمل أي عمليات رفع للصور في المنشورات على الإطلاق. حتى بصفتي مسؤولًا، أحصل على الخطأ “عذرًا، حدث خطأ أثناء رفع الملف. يرجى المحاولة مرة أخرى.” لقد حاولت مرارًا وتكرارًا وحصلت على نفس الخطأ.

تظهر سجلات الأخطاء ما يلي:

لم يتم العثور على MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb): لا يوجد ملف أو دليل @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

هل صُمم Discourse ليكون مجموعة نقاش “نصية فقط”؟ لقد قمت بزيادة جميع إعدادات الملفات للحد الأقصى للرفع إلى أحجام جنونية، ولا يمكنني حتى رفع صورة بحجم 7 كيلوبايت.

إذا لم يكن هناك شيء في /var/discourse، فقد يكون لديك تثبيت أقدم، تحقق أيضًا من /var/docker.

حسنًا، جرب إعادة البناء؟ قد يكون لديك صورة أساسية قديمة لم تتعامل بشكل صحيح مع عدم وجود مفتاح mmdb.

حسناً، إليك كيف تبدو تلك المجلدات.


أنا لست متأكداً من كيفية إعادة البناء. نرجو التوجيه! هذه تثبيت جديد تماماً على آلة افتراضية ولم أواجه أي أخطاء على الإطلاق. يبدو أن كل شيء يعمل باستثناء الرسومات.

كما يسأل جاي هنا: Uploading Files to Discourse - #3 by pfaffman
هل قمت بتثبيت Discourse الرسمي القياسي؟