Discourse rileva erroneamente il file caricato come immagine

Ho fatto qualche ricerca su questo problema.

In breve, il tuo file viene rilevato come JPEG perché inizia con la stessa firma di questo tipo di file.
È possibile correggere questo comportamento in Discourse, ma richiede una modifica. (vedi alla fine)


Ecco alcune informazioni tecniche.
Questo problema inizia qui:

La libreria FastImage apre il file e ne determina il tipo e le dimensioni.
Come previsto, restituisce un tipo JPEG.

Se guardi la firma JPEG, appare così:

Marcatori JPEG

Maggiori informazioni: List of file signatures - Wikipedia
JPEG - Wikipedia

Inizia sempre con i seguenti byte di marcatore: FF D8

Guardando il tuo campione di file con un editor esadecimale, vedrai che inizia allo stesso modo.

Ora, se guardi come FastImage rileva un JPEG, puoi vedere qui:

Tuttavia, non è possibile estrarre alcuna informazione sull’immagine poiché non sono presenti tutti i byte richiesti.

Come risolviamo questo problema in Discourse?
Guardando il codice di FastImage, c’è un’opzione preziosa che puoi passare.

Utilizzando questa opzione, qualsiasi errore (SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI) restituirà nessuna informazione sull’immagine; e il tuo file non verrà rilevato come immagine.

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

Quindi, ora può funzionare:

Posso fare una PR più tardi. L’uso di questa opzione ha senso qui. :+1: