2014-01-18 2 views
-2

У меня есть XML-данные, извлеченные из файла на стороне сервера, успешно доступны без использования серверных скриптов (например, php).Запись в файл XML на сервере apache с использованием jQuery (без использования сценария на стороне сервера)

Я хочу записать данные 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-файл на сервере остается неповрежденным. Было бы здорово понять, где я неправильно понял. В то же время я буду использовать этот PHP-код на стороне сервера и попытаться иметь его работы:

//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); 

Но все равно было бы хорошо, чтобы понять.

Кроме того, я хотел бы некоторые примечания об использовании типов файлов XML в коде $ .POST, а не в файл PHP (на основе $ .post Jquery документ):

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

Благодарности

+0

Я не верю, что можно работать на стороне сервера без формы на стороне сервера/ajax. Чтобы позволить такой тип инъекции стать серьезной дырой в безопасности. –

ответ

1

Вам нужен серверный скрипт для обработки всего, что изменяет сервер. В этом скрипте должны быть указаны ограничения на то, кому разрешено писать что и где. Это не из-за дизайна javascript; просто в любом случае любой может написать любой файл на любой веб-сервер, что явно небезопасно.

Когда URL-адрес запроса является скриптом, который отвечает на ввод пользователя, вы должны использовать HTTP POST. Когда URL-адрес запроса представляет собой файл, который будет записан (как в вашем случае), вы обычно используете HTTP PUT. (Вы действительно не должны использовать PUT - в конце концов, вы пишете скрипт обработчика, но запись в файл на сервере - это то, что для PUT.)

С точки зрения jquery запрос без сценариев на стороне сервера, запрос POST существенно не отличается от запроса GET, поскольку содержимое файла, найденного по URL-адресу, возвращается в качестве тела ответа. (Есть различия - например, POST не кэшируется - но я думаю, что это суть примера jquery, который вы упоминаете.)

+0

Спасибо, я только что немного исследовал REST, чтобы лучше понять. Проблема в том, что чем больше я читаю, тем больше вопросов у меня есть. 1. Можно ли просто использовать объект $ (xml) в вызове $ .ajax, если для contentType установлено значение «text/xml»? Причина, о которой я прошу, заключается в том, что я хотел бы избежать сериализации xml для строки. 2. Имеет ли смысл использовать имя файла xml в поле «url:» вызова $ .ajax, и если это так, какой файл сервера будет использоваться для его обработки, требует ли это установки в службе http apache? 3. Если я использую тип «PUT» в вызове ajax, так как файл php обрабатывает его, это имеет значение? – happyD

+0

Он должен перемещаться по проводу в виде байтов. Поэтому он должен стать струной в пути. – bmargulies

+0

Спасибо bmargulies.Функция ajax типа «GET» позволяет dataType xml, и хотя вызов GET также требует, чтобы данные перемещались по проводу в виде байтов, я надеялся/задавался вопросом, имел ли вызов PUT этот объект. – happyD

Смежные вопросы