Discourse: Hochgeladene Datei wird fälschlicherweise als Bild erkannt

Ich habe dieses Problem untersucht.

Kurz gesagt, Ihre Datei wird als JPEG erkannt, da sie mit der gleichen Signatur wie diese Art von Datei beginnt.
Das Beheben dieses Verhaltens in Discourse ist möglich, erfordert jedoch eine Änderung. (siehe unten)


Hier einige technische Details.
Dieses Problem beginnt hier:

Die Bibliothek FastImage öffnet die Datei und bestimmt den Typ und die Größe.
Wie erwartet, gibt sie den Typ JPEG zurück.

Wenn Sie sich die JPEG-Signatur ansehen, sieht sie so aus:

JPEG-Marker

Weitere Informationen: List of file signatures - Wikipedia
JPEG - Wikipedia

Sie beginnt immer mit den folgenden Marker-Bytes: FF D8

Wenn Sie sich Ihre Beispieldatei mit einem Hex-Editor ansehen, werden Sie feststellen, dass sie gleich beginnt.

Wenn Sie sich nun ansehen, wie FastImage ein JPEG erkennt, können Sie hier sehen:

Sie können jedoch keine Bildinformationen extrahieren, da nicht alle erforderlichen Bytes vorhanden sind.

Wie beheben wir dieses Problem in Discourse?
Wenn Sie sich den FastImage-Code ansehen, gibt es eine nützliche Option, die Sie übergeben können.

Durch die Verwendung dieser Option gibt jeder Fehler ( SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI) keine Bildinformationen zurück; und Ihre Datei wird nicht als Bild erkannt.

@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}")

Dann kann es jetzt funktionieren:

Ich kann später einen PR erstellen. Die Verwendung dieser Option ist hier sinnvoll. :+1: