【问题标题】:Why did the mime type of a text file change after changing the contents of a text file?为什么更改文本文件的内容后,文本文件的 mime 类型会发生变化?
【发布时间】:2016-05-18 19:33:55
【问题描述】:

我使用的是 Linux Debian 8.4 服务器,我正在运行一个 PHP 脚本,该脚本读取和解析 2 个 mime 类型为的文本文件

文本/纯文本; charset=us-ascii

并根据文本文件的内容发送 2 封电子邮件。在文本文件中,它们具有以下结构:

收件人:example@email.com

发件人:example2@email.com

主题:示例

等等。当回显第一个文本文件的 mime 类型时,它会打印出来

文本/纯文本; charset=us-ascii

到控制台

为了测试我的代码是否正常工作,我将电子邮件的格式更改为:

发件人:example2@email.com

收件人:example@email.com

主题:示例

现在在回显 mime 类型后,它会将其打印到控制台:

消息/rfc822; charset=us-ascii

为什么我只换了两行,但 mime 类型却发生了变化?不管怎样,文件不总是一个文本文件,应该有一个 text/plain mime 类型吗?

提前致谢。

【问题讨论】:

  • 可能你的 php 邮件库或服务器正在改变它。
  • 但是我以前编辑过这些文本文件。添加行,删除行等。突然发生这种情况似乎很奇怪

标签: php mime-types


【解决方案1】:

我假设您(或您正在使用的库)使用 Fileinfo 或直接调用 file 命令来确定 MIME 类型。

Fileinfo 的工作原理是在提供的文件的内容中搜索文件中特定位置的某些“神奇”字节序列。作为一个基本示例,如果文档的前四个字节是 0xFE 0x37 0 0x23,Fileinfo 会猜测它是 Microsoft Word 文档。

当然,这种方法并非万无一失,而且对于并不总是具有明显字节序列的基于文本(相对于二进制)格式来说,这是一个挑战。

message/rfc822 是一种电子邮件格式,用于在另一封电子邮件中包含一封电子邮件,例如通过邮件列表发送或当您在邮件阅读器中“作为附件转发”时发送。它是在RFC 2046 中定义的(相当令人惊讶,就像你第一次得知“1812 序曲”是在 1880 年写成的),它只是电子邮件内容的纯文本表示。它以标题和第一个标题开头,因此文件的打开内容是From: example@example.com

这就是为什么 Fileinfo 会根据开头行断定您的文档是电子邮件摘要中的消息:这是魔术文件中匹配 message/rfc822 的模式。真的不可能知道该文件是电子邮件消息还是恰好以From: 开头的纯文本,所以你得到一个有根据的猜测。 documentation for Fileinfo 明确表示它“不是防弹方法”。

您可以将自己的添加写入魔术文件。在 Ubuntu 中,它们以 man 5 magic 描述的格式进入 /etc/magic.mime(可能是 Debian 中的类似位置),所以理论上你可以用 text/ 覆盖 message/rfc822 匹配普通匹配。我不是语法方面的专家,所以我对此无能为力,但有在线指南。

或者您可以在代码中捕获这种不寻常的情况,例如 $mime_type = preg_replace("[^message/rfc822\b]", "text/plain", $mime_type);。不完全优雅,但你去吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2019-11-11
    • 2011-01-28
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多