【问题标题】:Writing to XML file on apache server using jQuery (without using server-side script)使用 jQuery 写入 apache 服务器上的 XML 文件(不使用服务器端脚本)
【发布时间】:2014-01-18 01:06:33
【问题描述】:

我从服务器端的文件中获取了 xml 数据,无需使用服务器端脚本即可成功访问(例如,没有 php)。

我想在一些小的更改后将该 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);

不过还是能理解就好了。

另外,我喜欢在 $.post 代码中使用 xml 文件类型而不是 php 文件(基于 $.post jquery doc)的一些说明:

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

谢谢

【问题讨论】:

  • 我不相信没有某种服务器端表单/ajax 处理程序就可以进行服务器端工作。允许这种注入将是一个严重的安全漏洞。

标签: javascript php xml jquery


【解决方案1】:

您需要一个服务器端脚本来处理任何修改服务器的内容。该脚本应规定允许谁写什么和在哪里写的限制。这不是由于javascript的设计;只是否则,任何人都可以将任何文件写入任何 Web 服务器,这显然是不安全的。

当请求的 URL 是响应用户输入的脚本时,您将使用 HTTP POST。当请求的 URL 表示要写入的文件(如您的情况)时,您通常会使用 HTTP PUT。 (您实际上不必使用 PUT - 毕竟您是编写处理程序脚本的人 - 但是写入服务器上的文件是 PUT 的用途。)

就 jquery 请求而言,没有服务器端脚本,POST 请求与 GET 请求没有显着不同,因为在 URL 中找到的文件内容作为响应的主体返回。 (存在差异——例如 POST 不会被缓存——但我认为这是你提到的 jquery 示例的要点。)

【讨论】:

  • 谢谢,我只是对 REST 做了一些研究以便更好地理解。问题是我读的越多,我的问题就越多。 1. 如果 contentType 设置为'text/xml',是否可以在 $.ajax 调用中只使用 $(xml) 对象?我问的原因是因为我想避免将 xml 序列化为字符串。 2. 在 $.ajax 调用的 'url:' 字段中使用 xml 文件名是否有意义,如果是,将使用哪个服务器文件来处理它,这是否需要在 http apache 服务上进行设置? 3.如果我在ajax调用中使用'PUT'类型,由于一个php文件处理它,它有什么不同吗?
  • 它必须以字节的形式通过网络传输。所以它必须在途中变成一个字符串。
  • 谢谢 bmargulies。 “GET”类型的 ajax 函数允许使用 dataType xml,尽管 GET 调用还需要数据以字节的形式通过网络传输,但我希望/想知道 PUT 调用是否也具有该功能。
猜你喜欢
  • 2011-05-22
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2016-04-04
  • 2010-10-15
  • 1970-01-01
  • 2014-10-13
相关资源
最近更新 更多