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: