【问题标题】:why some mp3s on mime_content_type return application/octet-stream为什么 mime_content_type 上的一些 mp3 返回 application/octet-stream
【发布时间】:2011-02-14 19:57:24
【问题描述】:

为什么在某些 mp3s 文件中,当我调用 mime_content_type($mp3_file_path) 时,它会返回 application/octet-stream?

这是我的代码:

if (!empty($_FILES)) {
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $image = getimagesize($tempFile);
    $mp3_mimes = array('audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio'); 
   
    if (in_array(mime_content_type($tempFile), $mp3_mimes)) { 
        echo json_encode("mp3");
    } elseif ($image['mime']=='image/jpeg') {
        echo json_encode("jpg");
    } else{
        echo json_encode("error");
    }
}

编辑: 我在这里找到了一个不错的课程:

http://www.zedwood.com/article/127/php-calculate-duration-of-mp3

【问题讨论】:

  • 也许显示一些代码?或此类文件的一些示例?

标签: php mp3 mime-types


【解决方案1】:

在识别 MP3 文件时,它们是一种奇怪的野兽。您可以使用 .wav 容器存储 MP3。文件开头可以有一个 ID3v2 标头。您基本上可以在任何文件中嵌入 MP3。

可靠地检测它们的唯一方法是慢慢解析文件并尝试找到看起来像 MP3 帧的东西。一帧是可能的有效 MP3 数据的最小单位,代表(离开内存)0.028 秒的音频。帧的大小因比特率和采样率而异,因此您不能只获取第一帧的比特率/采样率并假设所有其他帧的大小相同 - VBR mp3 必须完整解析计算总播放时间。

所有这一切归结为使用 PHP 的文件信息等来识别 MP3 是不可靠的,因为实际的 MP3 数据可以在文件中的任何位置开始。 fileinfo 只查看数据的前一千字节或两千字节,所以如果它说它不是 MP3,那么它很可能是在撒谎,因为数据开始的位置稍远。

【讨论】:

  • 那么解决办法是什么?
  • 在您的代码/逻辑中添加一个异常,当在文件名中看到 .mp3 扩展名时,会跳过 mime 类型检测并假定它是 audio/mp3。当然,这是一个折衷方案,具体取决于用例(例如,如果您想要 100% 的可靠性但检测速度较慢) - 您可能希望使用“缓慢解析文件并尝试找到看起来像 MP3 帧的东西" 答案中提到的方法。
【解决方案2】:

application/octet-stream 可能是mime_content_type 无法识别文件时的后备类型。

这种情况下的 MP3 不是真正的 MP3 文件,或者 - 更有可能 - 该文件是真正的 MP3 文件,但不包含 PHP 函数用来识别格式的“魔术字节” - 可能是因为它是不同的子格式或具有可变比特率等。

您可以试试getid3 是否能给您带来更好的结果。我从未使用过它,但它看起来是一个非常健康的库,可以从多媒体文件中获取大量信息。

如果您可以访问 PHP 的配置,您也可以使用change the mime.magic file PHP,尽管我不知道是否存在更好的文件来检测您的 MP3。 (mime.magic 文件是包含mime_content_type 用于识别某些文件类型的所有字节序列的文件。)

【讨论】:

  • 我有机会深入研究 getid3,如果我没记错的话,结果证明它仅通过扩展名来计算文件格式。
【解决方案3】:

Fleep 是这个问题的答案。允许 application/octet-stream 是危险的,因为 .exe 和其他危险文件可以使用该 mime 类型显示。

看到这个答案https://stackoverflow.com/a/52570299/14482130

【讨论】:

  • 如果在允许某些类型之前使用 is_executable 禁止可执行文件,那么允许 application/octet-stream 会不会有问题?
  • 不知道你的具体情况,所以不能肯定。我所知道的是,在没有进一步检查的情况下允许 application/octet-stream 可能是一个巨大的危险,因为你真的不知道文件是什么。从字面上看,它几乎可以是任何东西。在我看来,如果您决定允许 application/octet-stream,它首先完全违背了 mimetype 检查的目的。我不知道 is_executable 是如何工作的,所以我不能保证。我发现 flep 可以发现它是一个 mp3 文件,而无需依赖扩展名,尽管 mimetype 显示为 application/octet-stream。
猜你喜欢
  • 2016-03-13
  • 2020-01-26
  • 2011-09-19
  • 2012-11-25
  • 2014-06-08
  • 2023-03-22
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多