确定http文件上传的mime类型的最佳方法是什么?

时间:2009-05-20 21:52:46

标签: http web-applications

假设您有一个带有'file'类型输入标记的html表单。当文件发布到服务器时,它将与本地存储在一起,以及相关的元数据。

我可以想出三种确定mime类型的方法:

  • 使用'multipart / form-data'有效负载中提供的mime类型。
  • 使用'multipart / form-data'有效负载中提供的文件名,并根据文件扩展名查找mime类型。
  • 扫描原始文件数据并使用mime类型猜测库。

这些解决方案都不是完美的。

哪种解决方案最准确?
还有其他更好的选择吗?

2 个答案:

答案 0 :(得分:1)

如果您使用的是PHP,则可以使用

http://pecl.php.net/package/Fileinfo

将检查文件的许多方面。对于Python,您可以使用

http://pypi.python.org/pypi/python-magic/0.1

在Linux / Unix和Windows上,libmagic的绑定是什么?系统。参见:

man magic
man libmagic

在Linux上。它使用幻数测试来尝试和断言mime类型的文件。

我喜欢神奇的数字方法,因为如果您正在处理上传的网络服务器上的文件,它可以捕获错误的扩展和很多欺骗。这些测试通常是一次性的,因此读取文件的性能可以忽略不计。

答案 1 :(得分:1)

我认为你不能依赖其中任何一个作为明确的“我是mime type x”。前两个问题是提供的内容类型可能不正确,因为客户端(浏览器或其他方面)的问题或来自不同客户端的误导性请求(各种黑客尝试等等)。

所以你应该尝试组合每种类型的信息并计算出某种可信度。如果文件扩展名为.doc且mime类型为application / msword,那么它很可能是word文档,但是通过mime类型检测实用程序运行它只是为了确保。

应该有一个解决方案可用于使用你正在使用的语言进行mime魔法检测 - 你没有提到哪一个。它们通常通过查看文件的前几个字节/字符来工作,并将它们与mime类型的查找表进行匹配。有些还会从文件中删除BOM以帮助解决此问题。如果无法检测到mime类型,它们通常会回归到纯文本。

如果您想要一种独立于平台的方法,那么请查看存在的各种Java库: