为什么PHP不能正确返回JSON文件的MIME类型?

5

我知道json文件的正确MIME类型是application/json,可以通过这篇文章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返回的是text/plain而不是application/json

同样地,$_FILES['type']返回的是application/octet-stream而不是application/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,
})

1
@StephenAdelakun 对象 // 文件?它们不一样。 - Pogrindis
1
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、具体问题或错误以及重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整和可验证的示例 - Charlotte Dunois
1
一个JSON文件是plain/text,但当它通过互联网传输时,为了让接收代码将其识别为特定的JSON纯文本文件,它会在前面加上一个标头,表示它是application/json。该MIME类型未嵌入文件中。 - RiggsFolly
@StephenAdelakun,你能添加你的Ajax代码吗?像contentType这样的小细节很重要。 - Pogrindis
1
大家好,OP正在测试$_FILES['tmp_name']这个临时下载文件。对于该文件或任何其他文件,没有关联的MIME类型。___这里没有问题需要解决___。 - RiggsFolly
显示剩余12条评论
3个回答

5

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

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

不幸的是,JSON编码的内容没有签名,因此被标识为text/plainapplication/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);

在SO上,回答者很常见的做法是对提问者不耐烦地置之不理,而没有真正理解提问者想要什么。但这个问题是一个例外。 - Stephen Adelakun

4

我不确定你的实际问题是什么。它涉及到获取某些MIME类型的两种方式。

Fileinfo使用libmagic。正如其名称所示,这里发生了魔法。它基本上查看文件并尝试猜测文件可能是什么类型。如果它以开头,它将报告image/gif。猜测通常是错误的,但可能足够。

$_FILES包含客户端(Web浏览器)正在发送的信息。其中的类型是浏览器的想法。这通常是完全无用的。

如果您需要精确的类型,则必须自己确保。如何做取决于文件来自何处以及您计划进行什么操作。例如,如果这来自可信的管理员,则可以查看文件扩展名。对于从不太可信的用户上传的图像(我希望您不打算接受从不完全可信的用户上传的JavaScript文件来执行),一个好方法是实际尝试打开图像,甚至重新编码它(即去除exif数据)。


我不确定你是否清楚地阅读了我的问题。JSON文件的正确MIME类型是application/json。我需要测试这个,但为什么PHP没有返回它,尽管文件已保存为.json,文件包含格式良好的JSON内容,并且使用不同的测试方法返回text/plain - Stephen Adelakun

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

这跟 "*nix" 到底有什么关系? - Pogrindis
我不确定(知道)*dows系统上是否有任何file命令... - muchar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接