我正在寻找的是file -I
(达尔文; Linux上的-i)的对应物。
例如,给定:
$ file -I filename.pdf
filename.pdf: application/octet-stream; charset=binary
我希望能够做到这样的事情:
$ [someCommand] filename.pdf application/pdf
结果是filename.pdf将被输入为application / pdf。
问题的原因是有时Web服务器使用错误的MIME类型,这导致程序拒绝打开该文件。 (根据我的经验,最常见的是文字/简单。)
我一直在搜索man
,网站和本网站大约两个半小时。尝试了从十六进制转储到xattr
到文本编辑器的所有内容。
非常感谢你的帮助。
克里斯
答案 0 :(得分:11)
关于MIME类型的事情是它们几乎完全是虚构的。
MIME和HTTP要求我们假装所有文件都有一条标识“内容类型”的元数据。当我们在网络上发送文件时,“内容类型”元数据随之而来,因此没有人会误解文件的内容。
事实是这个元数据不存在。当MIME被发明时,说服任何操作系统供应商为文件采用新型系统真的为时已晚。 Unix已经确定了魔术数字,DOS已经确定了3个字母的文件名后缀,而经典的MacOS有其创建者代码和类型代码。 (MacOS类型代码最接近MIME模型,因为它们实际上与文件名和内容分开。但只有4个字母长,MIME类型不适合。)
没有人在其文件系统中存储与MIME兼容的内容类型。当MIME消息编写器或HTTP服务器想要发送文件时,它以传统方式(文件名后缀和/或幻数)决定文件类型,并将结果映射到MIME类型。
与理论(MIME消除文件类型猜测)相反,实际实现的MIME已将“基于文件名后缀和/或幻数”的猜测文件类型从文件的接收者移动到发送者。正如你所注意到的那样,发送者通常不会比接收者做的更好,如果被迫为自己搞清楚。通常在Web服务器的情况下,服务器急于在文件上打Content-type
会使事情变得更糟。 Web服务器没有理由知道它所服务的文件格式,只是用于分发它们而不需要解释它们的内容。
file
命令通过读取内容并查找幻数和字符串来猜测文件类型。 -I
选项不会改变这一点。它只选择不同的输出格式。
要更改Web服务器为特定文件发送的Content-Type
标头,您应该查看Web服务器的配置手册。你无法对文件本身做任何事情。
答案 1 :(得分:3)
如果您有pdf,并且$file --mime-type
命令回答octet-stream
而非application/pdf
,则说明您的文件已损坏。
pdf阅读器将读取它并忽略该问题,但如果您将此文件上载到Web应用程序,则应用程序会将mime-type识别为八位字节。有时这是一个问题,主要是如果你验证mime类型(我有时在我的应用程序中有这个问题)。
要获得快速解决方案,请使用如下的ghost脚本:
gs -o new.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress old.pdf
答案 2 :(得分:2)
谈论'文件的MIME类型'是一个类别错误 - '文件'没有MIME类型;只有八位字节流才有它们(我不一定不同意@ wumpus-q-wumbley对MIME类型的描述为'虚构',但这是考虑它的另一种方式。)
MIME代表多用途Internet邮件扩展,最初在RFC 2045中描述,MIME类型最初用于描述接收器应该很快对字节串做什么在电子邮件的 rest 中跟进电话。它们非常自然地重新用于(例如)HTTP协议,让客户端理解如何解释HTTP响应中的这个MIME类型构成标题的字节。
file
命令可以显示MIME类型的事实表明了这个想法的进一步扩展,作为一个关键,它允许窗口系统查找应该用于打开的应用程序的名称文件。
因此,如果'文件的MIME类型'意味着什么,它意味着'如果要响应HTTP请求而传递Web服务器将为此文件添加前缀的MIME类型'(或类似的东西) )。考虑到这一点,很明显MIME类型是Web服务器配置的一部分,而不是文件固有的任何内容 - 单个文件可能会提供各种MIME类型,具体取决于URL检索它,以及请求和配置的详细信息。因此,XHTML文件可能会以text/html
或application/xml
或application/octet-stream
的形式发送,具体取决于HTTP请求的详细信息,文件所在的目录,或者确实是月亮(后者将是无用的服务器配置)。
Web服务器可能有多种机制来决定这种MIME类型,可能包括基于任何文件扩展名的查找表,.htaccess
文件,或者file
的输出命令。
所以问题的答案是:取决于。
/etc/mime.types
文件的内容(如果你的系统使用它,并且服务器配置为使用它,那么。)file
命令的输出,由于其他原因,man file
是您的朋友,您可能需要在幻数中加入文件,合理谨慎。