我对此问题进行了一些研究。
简而言之,您的文件被检测为 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。使用此选项在这里是有意义的。