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

时间:2016-08-23 11:17:25

标签: php json mime-types mime

我知道json文件的正确MIME类型为text/plain,可以通过此帖What is the correct JSON content type?确认。

但是,我想知道为什么我的PHP安装返回$fileinfo = new finfo(); $fileType = $fileinfo->file( $_FILES['tmp_name'], FILEINFO_MIME_TYPE ); 。我需要在解析json文件之前测试正确的mime。

我有以下代码

$fileType

其中text/plain返回applicattion/json而不是$_FILES['type']

同样,application/octet-stream会返回applicattion/json而不是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, })

我错过了什么?

修改

我通过jQuery ajax发送文件:

Properties

3 个答案:

答案 0 :(得分:4)

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

Fileinfo使用libmagic。正如名字所示,这里发生了魔法。从本质上讲,它会查看文件并尝试猜测文件的类型。如果它以GIF89a开头,它将报告image / gif。猜测通常是错误的,但也足够了。

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

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

答案 1 :(得分:4)

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);

答案 2 :(得分:0)

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