2016-08-23 5 views
2

Я знаю, что правильный MIME-тип fo json-файлов - applicattion/json, что может быть подтверждено этим сообщением What is the correct JSON content type?.Почему PHP не возвращает правильный mime для json-файлов?

Однако, мне интересно, почему моя установка PHP возвращается text/plain. Мне нужно проверить правильный мим, прежде чем разбирать json-файл.

У меня есть следующий код

$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, 
}) 
+0

В чем заключен файл? –

+0

Какое расширение файла? –

+0

Также как вы отправляете файл? – Pogrindis

ответ

3

finfo определяет тип файла по содержанию, а не расширение файла.

Только файл с Подпись может быть идентифицирована должным образом. В противном случае будет отсутствовать либо text/plain (ASCII), либо application/octet-stream (двоичный) на основе его содержимого.

К сожалению, кодированное содержимое JSON не имеет подписи и, следовательно, имеет статус id-ed как text/plain или application/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); 
+0

Очень часто для ответчиков на SO, чтобы прыгать на OP и списаться без терпения, чтобы действительно понять, чего хочет OP. Это исключение. –

3

Я не совсем уверен, что ваша текущая проблема. Это относится к двум способам получения некоторого типа MIME.

fileinfo использует libmagic. Как видно из названия, здесь происходит волшебство. По сути, он смотрит на файл и пытается угадать, какой тип файла может быть. Если он начинается с GIF89a, он будет сообщать об изображении/gif. Догадка часто ошибочна, но может быть достаточно.

$_FILES содержит информацию, которую отправляет клиент (веб-браузер). тип в том, что в браузере. Это часто совершенно бесполезно.

Если вам нужен точный тип, вы должны убедиться в этом сами. Как это сделать, зависит от того, откуда идет файл и что вы планируете делать. то есть, если это исходит от надежного администратора, вы можете посмотреть расширение файла. Для изображений, загруженных от менее доверенных пользователей (надеюсь, вы не собираетесь принимать файлы javascript, загруженные из не полностью доверенных пользователей, которые должны выполняться), хороший способ - фактически попытаться открыть изображение и, возможно, даже перекодировать его (т.е. избавиться от данных exif)

+0

. Я не уверен, что вы четко читаете мой вопрос. Правильный тип mime для json-файла - 'application/json' Мне нужно чтобы проверить это, так почему PHP не возвращает это, несмотря на сохранение файла с '.json', файл, содержащий хорошо сформированный json-контент и использование разных методов для теста, возвращает' text/plain'. –

0

Если вы используете систему * nix, вы всегда можете попытаться использовать команду file.

+0

Что именно это получилось делать с «* nix»? – Pogrindis

+0

Я не думаю (знаю), если есть какая-либо команда 'file' на * dows системах ... – muchar

+0

Это' php' .. OS agnostic .. – Pogrindis