我知道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
答案 0 :(得分:4)
我不确定你的实际问题是什么。它指的是两种获取某种MIME类型的方法。
Fileinfo使用libmagic。正如名字所示,这里发生了魔法。从本质上讲,它会查看文件并尝试猜测文件的类型。如果它以GIF89a
开头,它将报告image / gif。猜测通常是错误的,但也足够了。
$_FILES
包含客户端(Web浏览器)正在发送的信息。那里的类型是什么浏览器的东西。这通常是完全没用的。
如果您需要精确类型,您必须自己确保这一点。如何执行此操作取决于文件的来源以及您打算执行的操作。即如果这来自值得信赖的管理员,您可以查看文件扩展名。对于从不太受信任的用户上传的图像(我希望你不打算接受从不完全信任的用户上传的javascript文件来执行),一个好方法是实际尝试打开图像,甚至可能重新编码它(即摆脱exif数据)
答案 1 :(得分:4)
finfo
按内容识别文件类型,而不是文件扩展名。
只能正确识别签名的文件。否则,将根据其内容被标记为text/plain
(ASCII)或application/octet-stream
(二进制)。
不幸的是,JSON编码的内容没有签名,因此被标记为text/plain
或application/octet-stream
。
如需进一步阅读,请访问: -
希望这有帮助。
[编辑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
命令。