确定MIME类型是二进制还是基于文本的

8

是否有一个库可以确定给定的内容类型是二进制还是基于文本的?

显然,text/* 总是文本的,但对于像 application/jsonimage/svg+xml 或甚至 application/x-latex 这样的内容类型,如果不检查实际数据,就很难确定。


你为什么不告诉我们你想用这些数据做什么呢? - amphetamachine
抱歉,我确实应该提供更多细节。本质上(虽然简化了,但概括了基础知识),我正在惰性加载数据 - 如果一个项目是基于文本的,则处理方式与加载二进制数据不同(只有内容类型事先已知)。 - AnC
3个回答

4

我不知道关于二进制和非二进制MIME类型的确切列表,但对于常见MIME类型,我认为以下内容相当不错。

def is_binary(mime_type, subtype):
    if mime_type == "text":
        return False
    if mime_type != "application":
        return True
    return subtype not in ["json", "ld+json", "x-httpd-php", "x-sh", "x-csh", "xhtml+xml", "xml"]

1
一个优雅的解决方案,谢谢。 - Nick Moore
刚被这个问题咬了一口屁股;image/svg+xml是文本。 - Mr. Developerdude

2
通常确定MIME类型的程序也会告诉你字符集。例如,file(1)(以及相应的libmagic)将提供以下输出:
> file --mime-encoding /bin/ls
/bin/ls: binary
> file --mime-encoding /etc/passwd
/etc/passwd: us-ascii

谢谢,但这需要访问实际数据,而这是不可用的 - 请查看我修改原帖的评论。 - AnC

2

有一个用于Python的libmagic包装器——pymagic。这是实现您想要的最简单的方法。请记住,魔术只不过是指纹一样的东西。如果某些东西“看起来”像另一种文件格式,那么可能会出现误报,但在大多数情况下,pymagic会给您所需的内容。

需要注意的一点是,“简单的解决方案”是检查任何字符是否“超出”可打印的ASCII范围,因为您可能会遇到Unicode,即使是文本内容,它看起来像二进制(实际上也是二进制)。


他正在询问如何确定一个MIME类型是否为二进制,而不是基于文件数据确定MIME类型。 - Glenn Maynard
1
值得怀疑的是,您是否希望自动信任服务器提供的 MIME 类型,但如果您这样做,则可以与 IANA MIME 类型注册表 http://www.iana.org/assignments/media-types/index.html 进行比较,尽管“mime 类型 XYZ 是二进制/文本”的界限不清,在大多数情况下,您只会被重定向到另一个 RFC,并在其中 buried 了细节。libmagic 只读取少量字节并可以合理地检测内容类型。此外,总有可能有人会为其自定义客户端编写一个随机的 MIME 类型。 - synthesizerpatel
我想这个评论已经回答了我的问题;我想要的是不可能的(请参见我上面的评论)。好吧,我可以绕过去,只是那样就不太优雅了... - AnC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接