为什么 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/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);
我知道 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/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);