检测到相同文件的不同文件mime类型

时间:2012-01-08 17:01:25

标签: php mime-types file-type

我正在上传一些文件。以下是上传脚本的一部分(我正在使用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类型将分别返回application/vnd.openxmlformats-officedocument.presentationml.presentationapplication/vnd.openxmlformats-officedocument.wordprocessingml.document pptxdocx个文件。

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

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

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

为什么在上传时没有返回相同的内容?我的代码有什么问题或我应该期待吗?我如何确定它是哪种文件类型?

1 个答案:

答案 0 :(得分:1)

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

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

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

  

为什么它不会像上传时那样返回?

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

正如您所看到的那样,文件类型越常见,它就越匹配(图像)。

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

  

我的代码是否有问题,或者我应该期待这个?

您不应期望finfo的mime类型与请求标头mime-type匹配。这是两件不同的事情。

  

我如何确定它是哪种文件类型?

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

此外,您可以决定添加更多内容。这完全取决于您对上传文件的处理方式。