2010-11-30 8 views
2

J'essaye d'envoyer du code html via la méthode $ .ajax() de jQuery, puis d'exporter le code html dans un nouveau fichier .html, mais le contenu est coupé pour une raison quelconque.Le contenu envoyé via jQuery ajax est tronqué

J'ai mis en place un test:

<html> 

<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script > 
$(document).ready(function(){ 
     var contents = $('html').html(); 
     var filename = "test/000.html"; 
     $.ajax({ 
     type: "POST", 
     url: "/file.php", 
     data: "content="+contents+"&fn="+filename, 
     dataType: "html", 
     success: function(msg, ts, xh){ 
      console.log(msg); 
      console.log(ts); 
      console.log(xh); 
      alert("success"); 
     }, 
     processData: false, 
     error: function(X, textStatus, error){ 
      alert("Error saving... please try again now.") 
     } 
    }); 
}); 
</script> 


</head> 

<body> 

<div id="rteContainer" class="dev"> 
    <div id="textEditor"> 
    <form> 
    <textarea name="balh" id="balh" rows="25" cols="103"></textarea> 
    <input type="button" id="updateContent" value="Update Changes"> 
    <input type="button" id="closeEditor" value="Close Without Saving"> 
    </form> 
    </div> 
</div> 

</body> 
</html> 

le fichier file.php est:

<?php 
header("Content-type:text/html;charset:UTF-8"); 
$content = "<html>".stripslashes(urldecode($_POST["content"]))."</html>"; 
$dump_file = $_POST["fn"]; 
$fp = fopen($dump_file, 'w'); 
fclose($fp); 
echo $content; 
?> 

Pourquoi devient coupé? Je suppose que c'est un problème d'encodage, mais je n'arrive pas à le comprendre.

+0

Pouvez-vous donner un exemple de la réponse que vous obtenez et où elle est coupée? –

Répondre

9

La chaîne html, contents, doit être codée en url avant d'être POST. Javascript fournit la fonction escape(), juste à cet effet.

passe $('html').html()-escape() et l'affecter à contents, comme ceci:

var contents = escape($('html').html()); 
+0

Cette réponse à vous a résolu mon problème en quelques secondes !! Je me grattais la tête pendant une demi-journée. Merci :) – VishwaKumar

0

Je suspecte que l'esperluette dans le javascript cause un problème. Essayez de le remplacer par "&" et voir si cela résout.

3

Votre script est en train de mourir d'embarras au trou de sécurité énorme en elle. Jamais, jamais, écrire dans un fichier où le nom de fichier est un paramètre de formulaire sans d'abord valider le nom de fichier. Même un pirate débutant pourrait utiliser ce script pour écraser tout fichier sur votre système auquel le serveur web a accès.

Dans votre appel Ajax, passer un tableau de style { } de paires de valeurs clés du paramètre data, ne pas concaténer les variables avec esperluette vous:

data: { content: contents, 
     fn: filename } 

Oh, et vous écrivez jamais réellement la contenu dans le fichier dump, donc tout ce qui pointe sur le fichier 'fn' sera juste tronqué.

L'espoir qui aide ...

+0

Merci. Je ne pensais pas à la sécurité quand je l'ai écrite, parce que ça va être protégé par mot quand c'est fait. Je ne suis pas sûr de ce que vous voulez dire que je ne suis jamais en train d'écrire dans le fichier de vidage. Êtes-vous en train de dire que le contenu existant est remplacé par le nouveau contenu? – Atomix

+0

Je veux dire que vous "fopen" le fichier de vidage, puis fermez-le tout de suite. Vous ne stockez pas '$ content' (voir' fwrite') dans le fichier. Mais veuillez d'abord résoudre le problème de sécurité ou quelqu'un utilisera votre script pour se remplacer. – Alnitak

+0

Aussi, FWIW, si vous passez correctement 'contents' comme indiqué ci-dessus, je ne pense pas que vous ayez besoin de l'échapper, mais vous devriez supprimer l'indicateur' processData' de l'appel Ajax. – Alnitak

Questions connexes