ديسكورس يتعرف بشكل خاطئ على ملف مُحمّل كصورة

لقد قمت ببعض البحث حول هذه المشكلة.

باختصار، يتم اكتشاف ملفك على أنه JPEG لأنه يبدأ بنفس التوقيع الخاص بهذا النوع من الملفات.
إصلاح هذا السلوك في Discourse ممكن، ولكنه يتطلب تعديلاً. (انظر في النهاية)


إليك بعض الأمور التقنية.
تبدأ هذه المشكلة هنا:

مكتبة FastImage تفتح الملف وتحدد النوع والحجم.
كما تتوقع، فإنها تُرجع نوع JPEG.

إذا نظرت إلى توقيع JPEG، فإنه يبدو كالتالي:

علامات JPEG

مزيد من المعلومات: List of file signatures - Wikipedia
JPEG - Wikipedia

يبدأ دائمًا ببايتات العلامة التالية: FF D8

بالنظر إلى عينة ملفك باستخدام محرر سداسي عشري، سترى أنها تبدأ بنفس الطريقة.

الآن، إذا نظرت إلى كيفية اكتشاف FastImage لملف JPEG، يمكنك رؤية ذلك هنا:

ومع ذلك، لا يمكنك استخراج أي معلومات عن الصورة نظرًا لعدم وجود جميع البايتات المطلوبة.

كيف نحل هذه المشكلة في Discourse؟
بالنظر إلى كود FastImage، هناك خيار قيم يمكنك تمريره.

باستخدام هذا الخيار، أي خطأ (SizeNotFound، ImageFetchFailure، CannotParseImage، UnknownImageType، BadImageURI) لن يُرجع أي معلومات عن الصورة؛ ولن يتم اكتشاف ملفك كصورة.

@image_info =
  begin
    FastImage.new(@file, :raise_on_failure => true)
  rescue StandardError
    nil
  end
...
is_image ||= @image_info && FileHelper.is_supported_image?("test.#{@image_info.type}")

بعد ذلك، يمكن أن يعمل الآن:

يمكنني إنشاء طلب سحب لاحقًا. استخدام هذا الخيار منطقي هنا. :+1: