2014-01-18 37 views
-2

我有從服務器端的文件中獲取的xml數據,無需使用服務器端腳本即可成功訪問(例如,不使用php)。使用jQuery在Apache服務器上寫XML文件(不使用服務器端腳本)

我想將xml數據寫回服務器端的文件,只需稍作更改,而不使用服務器端腳本(例如,不使用php)。以下是我迄今爲止:

<button id='WriteToXml'>Write to XML</button> 

<script>   

    $('#WriteToXml').click(function() { 

     var output_xml; 

     $.ajax({ 
      type: "GET", 
      url: "/data/testdata_input.xml", 
      dataType: "xml", 
      async: false, 

      success: function(xml) {    
       $(xml).find('input').remove(); 
       $(xml).find('test').append('<output></output>'); 
       output_xml = xml; 
      } 
     }); 

     // Alternative code? 
     // $.post("/data/testdata_output.xml", $(output_xml), "xml"); 

     $.ajax({ 
      type: 'POST', 
      url: "/data/testdata_output.xml", //url of receiver file on server 
      data: $(output_xml) , //your data 
      contentType: "text/xml", 
      dataType: "xml", 
      cache: false,  
      async: false, 

      success: function(xml) {console.log('success\n'+ $(xml).find('test'));} 

     }); 

    }); 

</script> 

another SO thread,我讀這是因爲JavaScript的設計(出於安全原因)必須使用服務器端腳本。但後來in another thread,我看到的代碼,不涉及PHP的,所以我希望我可以使用該代碼寫入到服務器上的XML文件:

$.ajax({ 
    type: 'POST', 
    url: "/data/testdata_output.xml", //url of receiver file on server 
    data: "<test></test>" , //your data 
    contentType: "text/xml", 
    dataType: "xml", 
    cache: false,  
    async: false, 

    success: function(xml) {console.log('success\n'+ $(xml).find('test') 

到目前爲止,我得到一個成功的消息,但服務器上的xml文件保持不變。理解我誤解的地方會很好。在此期間,我將在服務器端使用此代碼並嘗試使其工作:

//javascript 
$.post('savedata.php', {data: "<test></test>",filename: "/data/testdata_output.xml"}, function(){/*Save complete*/}); 

//savedata.php 
$data = $_POST['data']; 
$filename = $_POST['filename']; 
$f = fopen($filename, 'w+'); 
fwrite($f, $data); 
fclose($f); 

但它仍然很好理解。

而且,我喜歡上的$。員額代碼,而不是一個PHP文件中使用的XML文件類型的一些注意事項(基於.post的$ jQuery的DOC):

$.post("/data/testdata_output.xml", "<test></test>", "xml"); 

感謝

+0

我不相信有可能在沒有服務器端表單的情況下執行服務器端工作/某種類型的ajax處理程序。允許這種注入將是一個嚴重的安全漏洞。 –

回答

1

您需要一個服務器端腳本來處理修改服務器的任何內容。該腳本應該規定誰可以寫什麼和在哪裏的限制。這不是由於JavaScript的設計所致;否則,任何人都可以將任何文件寫入任何Web服務器,這顯然是不安全的。

當請求的URL是一個響應用戶輸入的腳本時,您將使用HTTP POST。當請求的URL表示要寫入的文件時(就像你的情況一樣),你通常會使用HTTP PUT。 (你真的不需要使用PUT - 畢竟你是編寫處理程序腳本的人 - 但是寫入服務器上的文件是PUT的一部分。)

在jquery請求,在沒有服務器端腳本的情況下,POST請求與GET請求沒有明顯區別,因爲URL中找到的文件內容作爲響應的主體返回。 (有差異 - 例如POST不會被緩存 - 但我認爲這就是您提到的jQuery示例的要點。)

+0

謝謝,我只是對REST做了一些研究,以便更好地理解。問題是我越讀越多的問題。 1.如果contentType設置爲'text/xml',是否可以在$ .ajax調用中僅使用$(xml)對象?我想問的原因是因爲我想避免將xml序列化爲字符串。 2.在$ .ajax調用的'url:'字段中使用xml文件名是否有意義,如果是,將使用哪個服務器文件來處理它,是否需要http apache服務上的設置? 3.如果我在ajax調用中使用類型'PUT',由於php文件處理它,它是否有所作爲? – happyD

+0

它必須以字節的形式通過導線。所以它必須成爲一個字符串。 – bmargulies

+0

謝謝bmargulies。「GET」類型的ajax函數允許dataType xml,雖然GET調用也需要數據以字節的形式通過線路傳輸,但我希望/想知道PUT調用是否也具有該功能。 – happyD

相關問題