Resumindo, seu arquivo está sendo detectado como JPEG porque começa com a mesma assinatura deste tipo de arquivo.
Corrigir esse comportamento no Discourse é possível, mas requer uma modificação. (veja no final)
Aqui algumas coisas técnicas.
Este problema começa aqui:
A biblioteca FastImage abre o arquivo e determina o tipo e o tamanho.
Como esperado, ela retorna um tipo JPEG.
Agora, se você olhar como o FastImage detecta um JPEG, você pode ver aqui:
No entanto, você não pode extrair nenhuma informação da imagem, pois nem todos os bytes necessários estão presentes.
Como corrigimos esse problema no Discourse?
Olhando o código do FastImage, há uma opção valiosa que você pode passar.
Usando essa opção, qualquer erro (SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI) não retornará nenhuma informação de imagem; e seu arquivo não será detectado como uma imagem.
@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}")