Discourse ошибочно определяет загруженный файл как изображение

Я немного покопался в этой проблеме.

Коротко: ваш файл определяется как 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}")

Теперь это может работать:

Я могу позже создать PR. Использование этого параметра здесь имеет смысл. :+1: