当前位置: 移动技术网 > IT编程>网页制作>XML > 使用XMLHTTP发送超长XML表单数据

使用XMLHTTP发送超长XML表单数据

2017年12月08日  | 移动技术网IT编程  | 我要评论

在把大量的xml作为post数据的一部分发送给你的iis服务器的时候——诸如在asp表单的textarea里——你可能会得到一些没有预料到的结果。当数据在服务器上被处理的时候,由于你处理数据方式的不同,你最终可能会碰到错误。其原因是,当你把数据提交回服务器的时候,post字段里有一个(数据)大小的限制。这样做的目的是为了防止可能的入侵者在实施拒绝服务(denial of service,dos)的攻击中向服务器发送超大量的数据。

 
这一限制也束缚你的能力。但是有办法解决这个问题。如果你没被限制在只能够通过form提交来发送数据,那么你就可以使用xmlhttp对象(微软的xml集里的一个dom对象)来发送所需要的xml:

var oxmlhttp = new activexobject("microsoft.xmlhttp");
oxmlhttp.open("post", "xml_handler.asp", false);
oxmlhttp.send(xml_to_send);

由于request对象会实现istream接口,所以你可以通过使用domdocument对象的load()方法来加载所要提交的xml:

dim odom
set odom = server.createobject("msxml2.domdocument")
odom.load request

如果你被限制在只能够使用form提交,那么你可以通过提交多个textarea或者input来跨越这一限制,前面两者在服务器一接收到这个form数据的时候就可以被重新组合在一起:

var maxlen = 90000;
var oform = document.createelement("form");
oform.method = "post";
oform.action = "xml_handler.asp";
oform = document.body.appendchild(oform);
var s = document.someform.txtxml.value;
if (s.length > maxlen) {
    while (s.length > maxlen) {
        var o = document.createelement("input");
        o.type = "hidden";
        o.name = "txtxml";
        o.value = s.substr(0, maxlen);
        oform.appendchild(o);
        s = s.substr(maxlen);
    }
    var o = document.createelement("input");
    o.type = "hidden";
    o.name = "txtxml";
    o.value = s.substr(0, maxlen);
    oform.appendchild(o);
} else {
    var o = document.createelement("input");
    o.type = "hidden";
    o.name = "txtxml";
    o.value = s;
    oform.appendchild(o);
}

这一段代码会创建一个新的form元素,用来处理数据的提交,并将它放置到body元素内。然后,它会检查即将提交给服务器的xml的长度。这个xml驻留在someform内部一个叫做txtxml的textarea里。
 

如果这个xml大于90,000字符的maxlen,那么这段代码就会创建多个隐藏的input(输入)元素,并把值的属性设置为90,000个字符的xml数据,或者设置为xml尾部的某个值,从而将这个数据分割成多个部分。如果这个xml的大小小于maxlen,那么这段代码就只会创建一个input并相应地设置值。然后这个数据就被提交到服务器供处理。

你可能已经注意到,我把相同的名称——txtxml——指定给新表单的每个字段。这将有助于把xml数据同其他可能会被提交的数据分隔开来,并为重组xml数据提供了一种简单的方式。在重组数据的时候,你需要一个简单的循环来连接字段里的数据:

dim str, fld
for each fld in request.form("txtxml")
    str = str & fld
next

由于已经为每个form元素都创建了一个字段集,所以你可以在同一个名称的字段里迭代。只要以适当的顺序在客户端创建form元素,你就不需要担心字段被遍历的顺序。通过form的appendchild()方法,这能够被轻易地实现。

数据在客户端是按照从左到右、从上到下的顺序被提交的,所以当你把input元素附加到form元素尾部的时候,在你服务端也总是按照同样的顺序来接收数据的。

如果你正在寻求实现一个大型的数据解决方案,例如将大量的excel数据从客户机器传递到服务器上,那么你就应该重新考虑是否要使用form提交,或者将数据从逻辑上分成多个小的部分。由于你无法使用文件类型input元素,所以最具有创造力的解决方案是将数据在本地转变成为xml,再将xml数据提交给服务器。反过来,数据会保存在服务器上,直到需要更进一步处理。

当然,处理这个问题可能会有更好的方法。但是当你没有太多时间的时候,你所需要的就是一个快速的、可用的解决方案。


 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网