2010-09-08 7 views
4

J'utilise Ajax file upload fonction avec son javascript/jQuery library.json retourne des données invalide erreur d'étiquette

Lorsque vous téléchargez un fichier, je continue à recevoir ce message d'erreur: SyntaxError: invalid label

Ceci est mon script JS:

jQuery('.uploadImage').live('click',function() { 
     ajaxFileUpload(); 
    }); 

(...) 

    function ajaxFileUpload(){ 
    jQuery.ajaxFileUpload({ 
      url:'../wp-content/plugins/wp-filebrowser/uploader.php', 
      secureuri:false, 
      fileElementId:'uploadFile', 
      dataType: 'json', 
      success: function (data, status){ 
       if(typeof(data.error) != 'undefined'){ 
        if(data.error != ''){ 
         alert(data.error); 
        }else{ 
         alert(data.msg); 
        } 
       } 
      }, 
      error: function (data, status, e){ 
       alert(data + ' - ' + status + ' - ' + e); 
      } 
     } 
    ) 
    return false; 
    } 

Mon script PHP fonctionne (testé avant d'utiliser JSON/jquery), mais il doit y être quelque chose de mal avec ma sortie json de mon fichier PHP. J'ai essayé deux approches. J'utilise json_encode pour formater la sortie.

Ceci est une partie de mon code PHP:

(...) 
    // Error message is at this stage empty. 
    move_uploaded_file($_FILES["file"]["tmp_name"], $uploadfile); 
    $respons = $_FILES["file"]["name"]._e(' successfully uploaded'); 

    $data = array("error"=> $error, "msg"=> $respons); 
    echo json_encode($data); 

MISE À JOUR
Il se trouve que j'utilisais _e() de Worpdress pour soutenir multilangue. Le problème est que _e() écho le contenu et par conséquent encombre la réponse JSON. Une fois que je suis passé à __() cela a fonctionné.

Merci d'aider medebug ce poblem gars.

+0

Etes-vous sûr que la sortie est correcte lorsque vous utilisez 'json_encode()'? – NullUserException

+0

Essayé 'echo '(' .json_encode ($ data). ')';'? – Wrikken

+0

J'utilise 'echo json_encode ($ data);' dans un autre projet et ça marche bien. Cependant, ici, je reçois cette sortie: 'uploadé avec succès [{" error ":" "," msg ":" __ Untitled-1.jpg "}]'. Cela ne semble pas correct ... – Steven

Répondre

2

La première approche ne produit pas de JSON valide. Jetez un oeil à la sortie de la fonction json_encode(), qui le génère correctement. Le problème principal est que les clés et les valeurs ne sont pas entourées de guillemets.

Avez-vous essayé d'utiliser firebug pour identifier la source exacte de l'erreur? Chaque clé JSON doit être une chaîne. Ce n'est évidemment pas le cas dans votre ligne défectueuse.

+0

L'utilisation de guillemets doubles ne faisait pas la différence avec anny. '$ Error' et' $ respons' sont tous deux des chaînes de texte. Je ne reçois aucun commentaire dans Firebug. Est-ce parce que IFrame dynamique est créé? – Steven

+0

Il ne suffit pas d'ajouter des guillemets doubles pour faire le travail. Je recommande fortement d'utiliser 'json_encode()' car il fait tout pour vous. Et oui, les iframes sont comme des fenêtres de navigateur séparées. Firebug ne fonctionne que sur la page en cours. – jwueller

+0

J'utilise 'json_encode'. Regardez mon code mis à jour. – Steven

-1

étiquettes JSON doivent entre guillemets:

"'error':" . $error . "'\n"; 

et ainsi de suite. De même, si $error contient des guillemets/deux-points, cela va aussi "casser" la syntaxe. Fondamentalement, vous êtes ouvert à l'équivalent JSON de l'injection SQL avec ce que vous faites. Il vaudrait mieux ne pas construire vous-même des chaînes JSON et simplement utiliser json_encode() sur des tableaux/objets PHP normaux. Si vous conservez la sortie des deux versions en quelque sorte (error_log()?), Vous pouvez les passer par http://jsonlint.com/ pour voir ce qui ne va pas avec eux.

+0

J'ai mis à jour mon code pour l'utiliser (sans chance): '$ data [] = array (" erreur "=> $ erreur," msg "=> $ respons); echo json_encode ($ data); ' – Steven

+0

Capturez la chaîne telle qu'elle est générée sur le serveur et comparez celle reçue par le navigateur. Peut-être que quelque chose pourrait être en train de le tripoter en transit (mod_security côté serveur, antivirus côté client, etc ...) –