如何在python中找到文件的mime类型?

时间:2020-03-05 18:47:33  来源:igfitidea点击:

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

假设:浏览器通过HTTP响应中的mime-type(content-type?)标头找出要使用的应用程序/查看器。

基于该假设,除了文件的字节外,我们还希望保存MIME类型。

我们将如何找到文件的MIME类型?我目前在Mac上,但是在Windows上也应该可以使用。

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

有一个整洁的python库可用于查找此信息吗? WebService还是(甚至更好的)可下载数据库?

解决方案

回答

标准库中的mimetypes模块将从文件扩展名确定/猜测MIME类型。

如果用户正在上传文件,则HTTP帖子将在数据旁边包含文件的MIME类型。例如,Django将这些数据作为UploadedFile对象的属性提供。

回答

我们没有说明正在使用的Web服务器,但是Apache有一个称为Mime Magic的漂亮小模块,当告知执行该操作时,它将用于确定文件的类型。它读取文件的某些内容,并尝试根据找到的字符找出文件的类型。就像Dave Webb提到的那样,只要有扩展名,python下的MimeTypes模块就可以使用。

或者,如果我们坐在UNIX机器上,则可以使用sys.popen('file -i'+ fileName,mode ='r')`来获取MIME类型。 Windows应该有一个等效的命令,但是我不确定它是什么。

回答

在python 2.6中:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]

回答

与使用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相匹配。

回答

toivotuo建议的python-magic方法已过时。 Python-magic的当前主干位于Github上,并根据该自述文件找到MIME类型,是这样完成的。

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