什么方法检测图像types更可靠:内容types或MIME嗅探?

我想在Windows应用程序中检测图像文件格式。 图像可以从网上下载(通过HTTP)或从本地文件加载。

哪种方法更可靠地检测从Web下载的文件的图像文件格式?

  • 文件扩展名是最明显的方法,但通常不正确或缺失
  • HTTP头内容types是一个很好的候选人(我可以检查图像types,而无需通过HTTP HEAD命令下载),但有时它没有正确设置
  • MIME嗅探(通过Windows API FindMimeFromData命令或手动检查文件内容的已知签名)是我知道的最后一个方法,但我从来没有使用它,我不知道它是否可靠

那么,我该用什么?

查看数据本身更可靠,但是您需要为每个要检测和处理的特定类型添加检查。 请注意,如果您使用的是内容类型,则需要确定此信息。
错误配置的服务器和数据猜测经常会得到所有基于zip格式的Windows小工具,Java jar等错误的内容类型,为此您需要另一种方式来区分类型(回退到扩展名等)。

大多数图像文件格式包含特定字节偏移量的标识符。 例如,JPG图像的偏移量为6的字符串为JFIF ,偏移量为1的PNG文件为PNG ,偏移量为0的GIF文件为GIF89GIF87 ,偏移量为0的BMP文件为BM ,依此类推。