我正在寻找的是一个与file -I
(达尔文;Linux上的-i )相对应的东西。
例如,给定:
$ file -I filename.pdf
filename.pdf: application/octet-stream; charset=binary
我希望能够做这样的事情:
$ [someCommand] filename.pdf application/pdf
结果是应用程序将被类型化为filename.pdf /pdf。
这个问题的原因是,有时web服务器使用错误的MIME类型,这导致程序拒绝打开文件。(根据我的经验,通常是文本/纯文本。)
我已经在man
、网站和这个网站上搜索了大约两个半小时。尝试了从十六进制转储到xattr
再到文本编辑器的所有方法。
您的帮助将不胜感激。
克里斯
发布于 2015-03-13 04:25:47
关于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服务器的配置手册。您无法对文件本身执行任何操作。
发布于 2015-03-13 05:02:35
谈论“文件的MIME类型”有点错误--“文件”没有MIME类型;只有八位位组的流才有MIME类型(我不一定不同意@wumpus-q-wumbley将MIME类型描述为“虚构的”,但这是另一种思考方式)。
MIME代表多用途Internet邮件扩展,最初在RFC 2045中进行了描述,MIME类型最初用于描述接收者应该如何处理电子邮件消息的其余部分中即将出现的字节串。它们在(例如) HTTP协议中被很自然地改变了用途,以便让客户端理解如何解释HTTP响应中的字节,该MIME类型构成了其报头。
file
命令可以显示MIME类型这一事实表明了这个想法的进一步扩展,它充当一个键,让窗口系统查找应该用来打开文件的应用程序的名称。
因此,如果‘文件的MIME类型’意味着什么,那就是‘如果文件是响应HTTP请求而发送的,web服务器将为该文件添加的MIME类型’(或类似的东西)。考虑到这一点,很明显MIME类型是web服务器配置的一部分,而不是文件固有的任何东西-单个文件可能带有各种MIME类型,这取决于检索它的URL,以及请求和配置的详细信息。因此,根据text/html
请求的细节、文件所在的目录,或者实际上是月相(后者是一个无用的服务器配置),XHTML文件可能会以application/xml
、application/octet-stream
或HTTP的形式交付。
web服务器可能有许多用于决定此MIME类型的机制,其中可能包括基于任何文件扩展名、.htaccess
文件或file
命令输出的查找表。
所以你的问题的答案是:视情况而定。
/etc/mime.types
文件的内容(如果您的系统使用该文件,并且服务器被配置为使用该文件)。file
命令的输出,则D16是您的最佳选择。您可能需要相当小心地在魔术数字文件中搜索。发布于 2016-06-03 21:57:38
如果您有pdf文件,而$file --mime-type
命令回答的是octet-stream
而不是application/pdf
,则说明您的文件已损坏。
pdf阅读器将读取该文件,并忽略该问题,但是如果您将此文件上传到web应用程序,该应用程序会将mime类型识别为octet-sream。有时这是一个问题,主要是在验证mime类型时(我有时在我的应用程序中遇到这个问题)。
要获得快速解决方案,请使用如下所示的ghost脚本:
gs -o new.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress old.pdf
https://stackoverflow.com/questions/29017725
复制相似问题