假设您想要在某个地方保存一堆文件,例如在blob中。假设您希望通过网页分发这些文件,并让客户端自动打开正确的应用程序/查看器。

假设:浏览器通过HTTP响应中的mime-type (content-type?)报头确定要使用哪个应用程序/查看器。

基于这个假设,除了文件的字节外,还需要保存MIME类型。

如何找到文件的MIME类型?我现在用的是Mac,但这应该也适用于Windows。

浏览器是否在将文件发布到网页时添加此信息?

是否有一个简洁的python库来查找这些信息?WebService还是(更好的)一个可下载的数据库?


当前回答

mimetypes模块只是基于文件扩展名来识别文件类型。如果尝试恢复没有扩展名的文件的文件类型,mimetypes将不起作用。

其他回答

对于可以使用的数组类型数据 magic.from_buffer (_byte_array mime = True)

有3个不同的库包装libmagic。

其中2个在pypi上可用(所以PIP安装可以工作):

filemagic python-magic

另一种类似于python-magic的方法可以在最新的libmagic源代码中直接获得,它可能是您的linux发行版中所拥有的。

在Debian中,python-magic包就是这样的,它像toivotuo说的那样被使用,它并没有像Simon Zimmermann说的那样被淘汰(IMHO)。

在我看来,这是另一种说法(出自《libmagic》的原作者)。

太糟糕了,pypi上不能直接使用。

Python 3参考:https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type(url, strict=True) Guess the type of a file based on its filename or URL, given by url. The return value is a tuple (type, encoding) where type is None if the type can’t be guessed (missing or unknown suffix) or a string of the form 'type/subtype', usable for a MIME content-type header. encoding is None for no encoding or the name of the program used to encode (e.g. compress or gzip). The encoding is suitable for use as a Content-Encoding header, not as a Content-Transfer-Encoding header. The mappings are table driven. Encoding suffixes are case sensitive; type suffixes are first tried case sensitively, then case insensitively. The optional strict argument is a flag specifying whether the list of known MIME types is limited to only the official types registered with IANA. When strict is True (the default), only the IANA types are supported; when strict is False, some additional non-standard but commonly used MIME types are also recognized.

import mimetypes
print(mimetypes.guess_type("sample.html"))

toivotuo提出的蟒蛇魔法方法已经过时了。Python-magic当前的主干在Github,基于那里的自述me,找到mime类型,是这样做的。

# For MIME types
import magic
mime = magic.Magic(mime=True)
mime.from_file("testdata/test.pdf") # 'application/pdf'

比使用mimetypes库更可靠的方法是使用python-magic包。

import magic
m = magic.open(magic.MAGIC_MIME)
m.load()
m.file("/tmp/document.pdf")

这相当于使用file(1)。

在Django中,还可以确保MIME类型与UploadedFile.content_type匹配。