为什么 PHP 没有为 json 文件返回正确的 MIME?

Why is PHP not returning correct mime for json files?

我知道 json 文件的正确 MIME 类型是 applicattion/json 可以通过此 post What is the correct JSON content type?.

确认

但是,我想知道为什么我的 PHP 安装返回 text/plain。在解析 json 文件之前,我需要测试正确的 mime。

我有以下代码

$fileinfo = new finfo();
$fileType = $fileinfo->file( $_FILES['tmp_name'], FILEINFO_MIME_TYPE );

其中 $fileType returns text/plain 而不是 applicattion/json.

同样,$_FILES['type'] returns application/octet-stream 而不是 applicattion/json

我错过了什么?

编辑

我正在通过 jQuery 发送文件 ajax:

var formData = new FormData( $(form)[0] );
var jsonFile = $( 'input:file[name=contents]', form ).get(0).files[0];

formData.append( 'jsonFile', jsonFile );

$.ajax({ 

    type: 'POST',
    url: 'url',
    data: formData,
    dataType:'json',
    enctype : 'multipart/form-data',
    processData: false,
    contentType : false,
    encode:true,
})

我不确定您的实际问题是什么。指的是获取某种MIME类型的两种方式。

文件信息使用 libmagic。顾名思义,这里发生了魔法。本质上,它查看文件并尝试猜测文件可能是什么类型。如果它以 GIF89a 开头,它将报告 image/gif。猜测经常是错误的,但足够了。

$_FILES 包含客户端(网络浏览器)发送的信息。那里的类​​型是浏览器的东西。这通常是完全没用的。

如果您需要精确的类型,您必须自己确保。如何执行此操作取决于文件的来源以及您打算执行的操作。也就是说,如果这来自值得信赖的管理员,您可能会查看文件扩展名。对于从不太受信任的用户上传的图像(我希望你不打算接受从不完全受信任的用户上传的 javascript 文件来执行)一个好方法是实际尝试打开图像,甚至可能重新编码它(即摆脱 exif 数据)

如果您使用的是 *nix 系统,您可以随时尝试使用 file 命令。

finfo 通过内容而不是文件扩展名来识别文件类型。

只能正确识别带有签名的文件。否则,将根据其内容被识别为 text/plain(ASCII)或 application/octet-stream(二进制)。

不幸的是,JSON 编码的内容没有签名,因此被标识为 text/plainapplication/octet-stream

如需进一步阅读,请访问:-

List of file signatures

希望对您有所帮助。

[编辑 1] 下面是我针对上述内容的测试脚本。干杯。

$filename = "test.json";

$finfo = finfo_open(FILEINFO_MIME_TYPE);

file_put_contents($filename, "<?php \n");
printf("%s\n", finfo_file($finfo, $filename));

file_put_contents($filename, "@echo off\n");
printf("%s\n", finfo_file($finfo, $filename));

file_put_contents($filename, json_encode(array("a" => "1")));
printf("%s\n", finfo_file($finfo, $filename));

file_put_contents($filename, "\xff");
printf("%s\n", finfo_file($finfo, $filename));

finfo_close($finfo);