在Python中,如何获取文件的content_type或mime_type?

3 投票
1 回答
2033 浏览
提问于 2025-04-16 17:43

可能重复的问题:
如何在Python中找到文件的mime类型?

我正在使用一个处理电子邮件的API(sendgrid.com),它会把所有收到的邮件发送到我应用中的一个网络请求处理程序。邮件的附件会以attachment0=xyz&attachment1=abc的形式发送,另外还有其他邮件字段,比如“收件人”、“抄送”、“主题”等等。

然后,我把这些附件存储在BlobStore(使用App Engine)。为了把这些文件提供给用户,我必须指定mime_type/content_type。根据我的理解,这通常是根据文件类型来决定的。但是我不太清楚如何从传递过来的字符串中获取文件类型。

有没有什么库可以根据文件的字节内容来判断文件类型?

为了澄清一下,这里没有文件名或文件扩展名,只有文件的字节内容。

1 个回答

4

如果你在上传文件时保存了文件名,可以用 mimetypes.guess_type 这个函数来试试。不过,Alexander 提到的那个 StackOverflow 问题也很值得一看。

可惜,这并不适用于你的情况。如果你只有一个二进制数据块,那你就得自己想办法了。可以按照以下简单步骤来操作:

  1. 建立一个已知文件类型的签名映射表。我马上给个例子。
  2. 从这个数据块中读取前4个字节。
  3. 根据你在第一步建立的映射表进行最长匹配。这里的最长匹配是指,如果4个字节都匹配,就用这个,然后再试3个字节、2个字节,最后是1个字节。

举个例子:

ZIP文件以两个字符 PK 开头,RAR文件以 Rar! 开头,PDF文件以 %PDF 开头,PNG文件以 \x89PNG 开头,等等。

这样的方法可能无法识别某些文件(比如JPG),但这是一个不错的起点。

另外,你也可以使用 https://github.com/ahupp/python-magic 这个库。

撰写回答