2016-08-23 3 views
2

Ich bin mir bewusst, dass der korrekte MIME-Typ für JSON-Dateien applicattion/json ist, wie durch diesen Beitrag What is the correct JSON content type? bestätigt werden kann.Warum gibt PHP keine korrekte Mime für JSON-Dateien zurück?

Allerdings frage ich mich, warum meine PHP-Installation text/plain zurückgibt. Ich muss auf den korrekten Pantomime prüfen, bevor ich die json Akte analysiere.

Ich habe den folgenden Code

$fileinfo = new finfo(); 
$fileType = $fileinfo->file($_FILES['tmp_name'], FILEINFO_MIME_TYPE); 

, in dem $fileType kehrt text/plain statt applicattion/json.

Wieder $_FILES['type'] gibt application/octet-stream statt applicattion/json zurück.

Was fehlt mir?

bearbeiten

ich die Datei durch jQuery Ajax schicke:

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

Was ist der Inhalt der Datei? –

+0

Was ist die Erweiterung der Datei? –

+0

Wie senden Sie die Datei? – Pogrindis

Antwort

3

finfo identifiziert Dateityp von ihm Inhalt, nicht Dateierweiterung.

Nur Datei mit Signatur könnte richtig identifiziert werden. Andernfalls wird auf der Grundlage des Inhalts entweder text/plain (ASCII) oder application/octet-stream (Binär) angegeben.

Leider hat der JSON-codierte Inhalt keine Signatur und wird daher als text/plain oder application/octet-stream bezeichnet.

Weiterführende Literatur finden Sie unter: -

List of file signatures

Hoffnung, das hilft.

[Bearbeiten 1] Unten ist mein Testskript für die oben genannten. Prost.

$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

Es ist sehr üblich für Antworter auf SO, am OP zu springen und ohne Geduld abzuschreiben, um zu verstehen, was das OP will. Dieser ist eine Ausnahme. –

3

Ich bin mir nicht ganz sicher, was Ihre eigentliche Problem ist. Es bezieht sich auf zwei Möglichkeiten, einen MIME-Typ zu erhalten.

Dateiinfo verwendet libmagic. Wie der Name schon sagt, passiert hier Magie. Im Wesentlichen betrachtet es die Datei und versucht zu erraten, welchen Typ eine Datei haben könnte. Wenn es mit GIF89a beginnt, wird es image/gif melden. Die Vermutung ist oft falsch, aber kann genug sein.

$_FILES enthält Informationen, die der Client (Webbrowser) sendet. der Typ drin ist was der Browser dinge. Dies ist oft völlig nutzlos.

Wenn Sie einen genauen Typ benötigen, müssen Sie dies selbst sicherstellen. Wie das geht, hängt davon ab, woher die Datei kommt und was Sie vorhaben. Wenn dies von einem vertrauenswürdigen Administrator stammt, können Sie sich die Dateierweiterung ansehen. Für Bilder, die von weniger vertrauenswürdigen Benutzern hochgeladen wurden (ich hoffe, dass Sie keine JavaScript-Dateien akzeptieren, die von nicht voll vertrauenswürdigen Benutzern hochgeladen wurden), ist es ein guter Weg, das Bild zu öffnen und es möglicherweise sogar neu zu kodieren exif-Daten loswerden)

+0

Ich bin mir auch nicht sicher, ob du meine Frage klar gelesen hast Der richtige Mime-Typ für die JSON-Datei ist 'application/json' Um dies zu testen, warum gibt PHP das trotz des Speicherns der Datei mit '.json' nicht zurück, wobei die Datei wohlgeformten JSON-Inhalt enthält und verschiedene Methoden für den Test verwendet, gibt' text/plain' zurück. –

0

Wenn Sie auf einem * nix-System sind, können Sie immer versuchen, den Befehl file zu verwenden.

+0

Was genau hat das? mit "* nix" zu tun? – Pogrindis

+0

Ich glaube nicht (wissen), wenn es irgendeinen 'Datei'-Befehl auf * dows-Systemen gibt ... – muchar

+0

Das ist' php' .. OS agnostic .. – Pogrindis

Verwandte Themen