繁体   English   中英

如何从终端更改文件的 MIME 类型?

[英]How do you change the MIME type of a file from the terminal?

我正在寻找的是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 、 web 和这个站点大约两个半小时。 尝试了从十六进制转储到xattr再到文本编辑器的所有内容。

您的帮助将不胜感激。

克里斯

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 服务器的配置手册。 您对文件本身无能为力。

谈论“文件的 MIME 类型”有点类别错误——“文件”没有 MIME 类型; 只有八位字节流有它们(我不一定不同意 @wumpus-q-wumbley 将 MIME 类型描述为“虚构”,但这是另一种思考方式)。

MIME 代表多用途 Internet 邮件扩展,如最初在RFC 2045 中所述,并且 MIME 类型最初旨在描述接收者应该如何处理即将沿着线路传输的一堆字节,在电子邮件的其余部分. 它们在(例如)HTTP 协议中被非常自然地重新利用,让客户端了解如何解释 HTTP 响应中的字节,该 MIME 类型形成其标头。

file命令可以显示 MIME 类型的事实表明该想法的进一步扩展,作为让窗口系统查找应该用于打开文件的应用程序名称的键。

因此,如果“文件的 MIME 类型”意味着任何东西,则它意味着“如果要响应 HTTP 请求而传送 Web 服务器将作为该文件的前缀的 MIME 类型”(或类似的东西)。 这么想,很明显 MIME 类型是 Web 服务器配置的一部分,而不是文件固有的任何内容——根据检索它的 URL 和请求的详细信息,单个文件可能会带有各种 MIME 类型和配置。 因此,XHTML 文件可能会作为text/htmlapplication/xmlapplication/octet-stream传送,具体取决于 HTTP 请求的详细信息、文件所在的目录或月相(后者将无用的服务器配置)。

Web 服务器可能有多种机制来决定此 MIME 类型,其中可能包括基于任何文件扩展名的查找表、 .htaccess文件,或者实际上是file命令的输出。

所以你的问题的答案是:这取决于

  • 如果您想要做的是更改 Web 服务器提供此文件的方式,那么您需要查看您的Web 服务器文档或系统的/etc/mime.types文件的内容(如果您的系统使用该文件并且服务器配置为依靠它)。
  • 如果您想要做的是更改打开给定(类型)文件的应用程序,那么您的操作系统/窗口管理器文档应该会有所帮助。
  • 如果您出于某种其他原因需要专门更改file命令的输出,那么man file是您的朋友,您可能需要相当小心地在幻数文件中四处游荡。

如果您有 pdf,并且$file --mime-type命令回答octet-stream而不是application/pdf ,则您的文件已损坏。

pdf 阅读器会阅读它,并忽略该问题,但如果您将此文件上传到 Web 应用程序,该应用程序会将 mime 类型识别为八位字节流。 有时这是一个问题,主要是如果您验证 mime 类型(我的应用程序中有时会遇到此问题)。

要获得快速解决方案,请使用如下所示的 ghost 脚本:

gs -o new.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress old.pdf

好吧,我有一个很难解释的问题:我有两个.xlsx文件(Excel电子表格)。 一种是由Excel创建的,另一种是由PHP库创建的。 两者都具有.xlsx扩展名。

如果同时使用文件--mime-type,则会得到:第一个是application / vnd.openxmlformats-officedocument.spreadsheetml.sheet,第二个是application / zip。

这与以下理论完全不符:MIME类型是虚构的,仅通过扩展关联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM