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

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

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

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

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

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


当前回答

你没有说明你使用的是什么web服务器,但Apache有一个很好的小模块,叫做Mime Magic,它用来确定文件的类型,当被告知这样做。它读取文件的一些内容,并试图根据找到的字符找出文件的类型。正如Dave Webb提到的,python下的MimeTypes模块可以工作,只要有一个方便的扩展。

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

其他回答

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

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

你没有说明你使用的是什么web服务器,但Apache有一个很好的小模块,叫做Mime Magic,它用来确定文件的类型,当被告知这样做。它读取文件的一些内容,并试图根据找到的字符找出文件的类型。正如Dave Webb提到的,python下的MimeTypes模块可以工作,只要有一个方便的扩展。

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

在python 2.6中:

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

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

@toivotuo的方法在python3下工作得最好,最可靠。我的目标是识别那些没有可靠的.gz扩展名的gzip文件。我安装了python3-magic。

import magic

filename = "./datasets/test"

def file_mime_type(filename):
    m = magic.open(magic.MAGIC_MIME)
    m.load()
    return(m.file(filename))

print(file_mime_type(filename))

对于一个gzip文件,它返回: 应用程序/ gzip;charset =二进制

对于解压缩的TXT文件(iostat数据): 文本/平原;charset = us - ascii

对于tar文件: 应用程序/ x-tar;charset =二进制

对于bz2文件: 应用程序/ x-bzip2;charset =二进制

最后但并非最不重要的一个。zip文件: 应用程序/邮政编码;charset =二进制