【问题标题】:Different file mime type detected for same file为同一文件检测到不同的文件 mime 类型
【发布时间】:2012-01-08 17:01:24
【问题描述】:

我正在上传一些文件。下面是上传脚本的一部分(我使用的是https://github.com/blueimp/jQuery-File-Upload/blob/master/php/index.php的代码)

$upload = isset($_FILES[$this->options['param_name']]) ?
                $_FILES[$this->options['param_name']] : null;
$info = array();
if ($upload && is_array($upload['tmp_name'])) {
    foreach ($upload['tmp_name'] as $index => $value) {
    $info[] = $this->handle_file_upload(
    $upload['tmp_name'][$index],
            isset($_SERVER['HTTP_X_FILE_NAME']) ?
                  $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'][$index],
            isset($_SERVER['HTTP_X_FILE_SIZE']) ?
                  $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'][$index],
            isset($_SERVER['HTTP_X_FILE_TYPE']) ?
                  $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'][$index],
                   $upload['error'][$index]
     );
}

选中后,通过$_SERVER['HTTP_X_FILE_TYPE']$upload['type'][$index] 的mime 类型分别为pptxdocx 文件返回application/vnd.openxmlformats-officedocument.presentationml.presentationapplication/vnd.openxmlformats-officedocument.wordprocessingml.document

现在完成上传后,我正在尝试显示文件,我正在使用finfo_file() 获取 mime 类型。

$mime_type = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file_path);
echo $mime_type;

对于图像文件(如 png、jpeg)和 pdf,类型按预期返回,但对于 pptxdocx 文件,返回的 mime 类型为 application/zip

为什么返回的结果与上传时不同?我的代码有问题还是我应该期待这个?那我该如何决定它是哪种文件类型呢?

【问题讨论】:

    标签: php mime-types file-type


    【解决方案1】:

    同一个文件可以有不同的多种mime-types,这是完全正常的。

    此外,mime-type 只是文件本身旁边的元信息。从理论上讲,您可以为任何文件提供任何 mime 类型。这不会很有用,但它有效。这只是一个概念。

    finfo 库将通过查看文件尝试识别格式来尝试“神奇地”获取文件的 mime 类型。然后它会根据它的数据库返回mime-type。

    为什么返回的和上传时不一样?

    请求中的 mime-type 由 HTTP 客户端给出。它也可能会猜测,但通常它会从底层操作系统为该文件提供的信息中获取值。

    正如您在问题中看到的那样,文件类型越常见,匹配得越好(图像)。

    但是,由于 pptx 和 docx 文件实际上是 zip 文件,finfo 库会将它们识别为 application/zip,因为这些文件的标题(幻数)表明它在技术上是一个 zip 文件。

    我的代码有问题还是我应该预料到这种情况?

    您不应期望 finfo 的 mime-type 与请求标头 mime-type 匹配。这是两个不同的东西。

    那么我该如何决定它是哪种文件类型呢?

    这取决于。您可以决定信任 http 标头,您可以决定信任 finfo,您也可以决定比较文件扩展名以及这三者的组合。

    此外,您还可以决定添加更多。这完全取决于您如何处理上传的文件。

    【讨论】:

    • 所以如果我使用finfo,有没有办法进一步确定文件类型,而不仅仅是检测它是否是zip 文件。比如这里,通过finfo我可以判断一个文件是docx还是pptx
    • 技术上自然是可能的,例如您可以开始为您想要识别的任何指定文件类型编写解析器。但是,这需要有关文件类型的特殊知识并且可能很麻烦。或者,可能已经存在用于验证文件是否有效的不同文件类型的库。因此,这在很大程度上取决于您打算如何处理这些文件,因此您可以决定您的应用程序所需的详细程度。
    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 2011-06-19
    • 2011-05-05
    • 2015-12-20
    • 2012-04-21
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多