Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检测到同一文件的不同文件mime类型_Php_Mime Types_File Type - Fatal编程技术网

Php 检测到同一文件的不同文件mime类型

Php 检测到同一文件的不同文件mime类型,php,mime-types,file-type,Php,Mime Types,File Type,我正在上传一些文件。下面是上传脚本的一部分(我使用的代码来自) 选中时,mime类型通过$\u服务器['HTTP\u X\u文件类型]或$upload['type'][$index]返回application/vnd.openxmlformats of cedocument.presentationml.presentation,application/vnd.openxmlformats of cedocument.wordprocessingml.documentforpptx,docx文件

我正在上传一些文件。下面是上传脚本的一部分(我使用的代码来自)

选中时,mime类型通过
$\u服务器['HTTP\u X\u文件类型]
$upload['type'][$index]
返回
application/vnd.openxmlformats of cedocument.presentationml.presentation
application/vnd.openxmlformats of cedocument.wordprocessingml.document
for
pptx
docx
文件

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

$mime_type = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file_path);
echo $mime_type;
对于图像文件(如png、jpeg)和pdf,类型按预期返回,但对于
pptx
docx
文件,返回的mime类型为
application/zip


为什么上传时返回的结果与上传时不一样?我的代码有问题吗?或者我应该预料到这一点吗?那么如何确定它是哪种文件类型呢?

同一个文件可以有不同的多个mime类型,这是完全正常的

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

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

为什么上传时返回的结果与上传时不一样

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

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

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

我的代码有问题吗?或者我应该预料到这一点吗

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

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

那要看情况。您可以决定信任http头,您可以决定信任
finfo
,您还可以决定比较文件扩展名以及三者的组合


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

同一个文件可以有不同的多个mime类型,这是完全正常的

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

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

为什么上传时返回的结果与上传时不一样

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

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

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

我的代码有问题吗?或者我应该预料到这一点吗

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

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

那要看情况。您可以决定信任http头,您可以决定信任
finfo
,您还可以决定比较文件扩展名以及三者的组合


此外,您还可以决定添加更多。这完全取决于您对上传的文件所做的操作。

因此,如果我使用
finfo
,除了检测它是否是
zip
文件之外,还有什么方法可以进一步确定文件类型呢。例如,在这里,通过
finfo
我将能够确定一个文件是
docx
还是
pptx
?从技术上来说,这自然是可能的,例如,您可以开始为您想要识别的任何指定文件类型编写解析器。但是,这需要有关文件类型的专门知识,而且可能会很麻烦。或者,不同文件类型的库可能已经存在,可以验证文件是否有效。因此,这在很大程度上取决于您计划如何处理文件,以便您可以决定应用程序所需的详细程度。因此,如果我使用
finfo
,除了检测文件是否为
zip
,还有什么方法可以进一步确定文件类型。例如,在这里,通过
finfo
我将能够确定一个文件是
docx
还是
pptx
?从技术上来说,这自然是可能的,例如,您可以开始为您想要识别的任何指定文件类型编写解析器。但是,这需要有关文件类型的专门知识,而且可能会很麻烦。或者,不同文件类型的库可能已经存在,可以验证文件是否有效。因此,这在很大程度上取决于您计划如何处理这些文件,以便您可以决定您的应用程序需要哪一级别的详细信息。
$mime_type = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file_path);
echo $mime_type;