2010-11-30 3 views
2

jQuery의 $ .ajax() 메소드를 통해 html을 보내려고하고 html을 새로운 .html 파일로 덤프하려고하지만 컨텐츠가 왠지 잘려나 가고 있습니다.jQuery ajax를 통해 전송 된 컨텐츠가 잘림되지 않습니다.

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

왜 끊어지고있다

나는 테스트 케이스를 설정? 문제가 인코딩 된 것 같아요,하지만이 알아낼 수 없습니다.

+0

당신이 받고있는 응답의 예와 그 부분이 잘릴 수 있습니까? –

답변

9

html 문자열 contentsPOST 앞에 url로 인코딩되어야합니다. Javascript는 이러한 목적으로 escape() 함수를 제공합니다.

패스 escape()-$('html').html() 등처럼 contents에 할당 :

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

이 답변으로 내 문제가 몇 초 만에 해결되었습니다 !! 나는 반나절 동안 머리를 긁적 거리고 있었다. 감사합니다 :) – VishwaKumar

0

자바 스크립트의 앰퍼샌드가 문제를 일으키는 것으로 의심됩니다. 그것을 '&'으로 바꾸고 수정했는지 확인하십시오.

3

스크립트가 거기에 엄청난 보안 구멍에 당황 죽어 가고있다.

파일 이름이 형식 매개 변수 인 파일에 파일 이름을 먼저 확인하지 않고 쓰지 마십시오. 초보자 해커조차도이 스크립트를 사용하여 웹 서버가 액세스 할 수있는 시스템의 모든 파일을 덮어 쓸 수 있습니다. 당신의 Ajax 호출에

는 앰퍼샌드 자신과 변수을 연결하지 마십시오 data 매개 변수의 키 값 쌍의 { } 스타일의 배열을 전달 :

data: { content: contents, 
     fn: filename } 

아, 그리고 당신은 결코 실제로를 작성하지있어 내용을 덤프 파일에 넣으므로 'fn'이 가리키는 파일은 잘립니다.

도움이 되었으면 좋겠다 ...

+0

감사. 완료 될 때 비밀번호로 보호되기 때문에 보안을 생각할 때 작성하지 않았습니다. 내가 덤프 파일에 실제로 쓰지 않는다는 것이 무슨 뜻인지 모르겠습니다. 기존 콘텐츠가 새로운 콘텐츠로 덮어 쓰게된다는 말입니까? – Atomix

+0

덤프 파일을'fopen '한 다음 곧바로 닫는 것을 의미합니다. 파일에'$ content' ('fwrite' 참조)를 저장하지 마십시오. 그러나 먼저 보안 문제를 해결하십시오. 그렇지 않으면 누군가 자신의 스크립트를 사용하여 자신을 덮어 쓰게됩니다. – Alnitak

+0

또한, FWIW, 위와 같이'contents'를 올바르게 전달했다면 이스케이프 할 필요가 없지만 Ajax 호출에서 'processData' 플래그를 제거해야합니다. – Alnitak

관련 문제