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

cur*_*eux 19 linux macos terminal mime-types

我正在寻找的是file -I(达尔文; Linux上的-i).

例如,给定:

$ file -I filename.pdf
filename.pdf: application/octet-stream; charset=binary
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

$ [someCommand] filename.pdf application/pdf
Run Code Online (Sandbox Code Playgroud)

结果是filename.pdf将被输入为application/pdf.

问题的原因是有时Web服务器使用错误的MIME类型,这导致程序拒绝打开该文件.(根据我的经验,最常见的是文字/简单.)

我一直在搜索man,网站和这个网站大约两个半小时.尝试从十六进制转储xattr到文本编辑器的所有内容.

非常感谢您的帮助.

克里斯

小智 15

关于MIME类型的事情是它们几乎完全是虚构的.

MIME和HTTP要求我们假装所有文件都有一段标识"内容类型"的元数据.当我们在网络上发送文件时,"内容类型"元数据随之而来,因此没有人会误解文件的内容.

事实是这个元数据不存在.当MIME被发明时,说服任何操作系统供应商为文件采用新型系统真的为时已晚.Unix已经确定了魔术数字,DOS已经确定了3个字母的文件名后缀,而经典的MacOS有其创建者代码和类型代码.(MacOS类型代码最接近MIME模型,因为它们实际上与文件名和内容分开.但只有4个字母长,MIME类型不适合.)

没有人在其文件系统中存储与MIME兼容的内容类型.当MIME消息编写器或HTTP服务器想要发送文件时,它以传统方式(文件名后缀和/或幻数)决定文件类型,并将结果映射到MIME类型.

与理论(MIME消除文件类型猜测)相反,在实践中实现的MIME已经将"基于文件名后缀和/或幻数"的猜测文件类型从文件的接收者移动到发送者.正如你所注意到的那样,发送者通常不会比接收者做的更好,如果被迫为自己搞清楚.通常在Web服务器的情况下,服务器急于Content-type打开文件会使事情变得更糟.Web服务器没有理由知道它所服务的文件的格式,只是用于分发它们而不需要解释它们的内容.

file命令通过读取内容并查找幻数和字符串来猜测文件类型.该-I选项不会改变这一点.它只是选择不同的输出格式.

要更改Content-TypeWeb服务器为特定文件发送的标头,您应该查看Web服务器的配置手册.你无法对文件本身做任何事情.

  • 值得注意的是,如今的二进制云存储(Amazon S3、Azure Blob Storage 等)确实为每个二进制文件存储了单独的元数据,包括“Content-Type”。无论上传客户端在 Content-Type 标头中作为 mime 类型传递的任何内容都将存储在那里,并在使用 GET 或 HEAD 请求读取资源时返回。 (2认同)