通过jQuery ajax发送的内容正在被切断

时间:2010-11-30 20:08:14

标签: php html ajax jquery

我试图通过jQuery的$ .ajax()方法发送html,然后将html转储到新的.html文件中,但内容因某种原因被切断了。

我已经设置了一个测试用例:

<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>

file.php文件是:

<?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;
?>

为什么会被切断?我猜这是编码问题,但我无法解决这个问题。

3 个答案:

答案 0 :(得分:9)

html字符串contents必须在POST之前进行网址编码。 Javascript提供escape()函数,仅用于此目的。

$('html').html()传递给escape()并将其分配给contents,如下所示:

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

答案 1 :(得分:3)

你的剧本在其庞大的安全漏洞中濒临尴尬。

永远不要写入文件名,其中文件名是表单参数,而不首先验证文件名。即使是新手黑客也可以使用此脚本覆盖您的系统上Web服务器可以访问的任何文件。

在Ajax调用中,在{ }参数中传递data样式的键值对数组,不要自己用和号连接变量:

data: { content: contents,
        fn: filename }

哦,你实际上从来没有把内容写入dumpfile,所以'fn'指向的任何文件都会被截断。

希望有帮助...

答案 2 :(得分:0)

我怀疑javascript中的&符导致问题。尝试用“&amp;”替换它看看是否能修复它。