Discourseがアップロードされたファイルを誤って画像として検出する

この問題について調査しました。

要するに、あなたのファイルは、この種のファイルと同じシグネチャで始まるため、JPEGとして検出されています。
Discourseでこの動作を修正することは可能ですが、変更が必要です。(最後に参照)


技術的な詳細をいくつか示します。
この問題はここで始まります:

FastImageライブラリはファイルを開き、タイプとサイズを決定します。
予想どおり、JPEGというタイプが返されます。

JPEGシグネチャを見ると、次のようになります。

JPEGマーカー

詳細情報:List of file signatures - Wikipedia
JPEG - Wikipedia

常に次のマーカーバイトで始まります:FF D8

サンプルファイルをHexエディタで確認すると、同じように始まっていることがわかります。

次に、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: