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

2022-04-22 00:00:00 json mime-types mime php

我知道json文件的正确MIME类型是applicattion/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而不是applicattion/json

同样,$_FILES['type']返回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,
})

解决方案

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 
");
printf("%s
", finfo_file($finfo, $filename));

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

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

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

finfo_close($finfo);

相关文章