Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Verwendung von XMLHTTP zum Senden extrem langer XML-Formulardaten

Detaillierte Einführung in die Verwendung von XMLHTTP zum Senden extrem langer XML-Formulardaten

黄舟
黄舟Original
2017-03-06 16:28:351411Durchsuche

Wenn Sie als Teil der POST-Daten eine große Menge XML an Ihren IIS-Server senden – beispielsweise in einem TEXTAREA eines ASP-Formulars – erhalten Sie möglicherweise unerwartete Ergebnisse. Bei der Verarbeitung der Daten auf dem Server kann es aufgrund der Art und Weise, wie Sie die Daten verarbeiten, zu Fehlern kommen. Der Grund dafür ist, dass beim Zurücksenden von Daten an den Server eine (Daten-)Größenbeschränkung im POST-Feld besteht. Damit soll verhindert werden, dass mögliche Eindringlinge bei einem Denial-of-Service-Angriff (DoS) extrem große Datenmengen an den Server senden.


Diese Einschränkung schränkt auch Ihre Fähigkeiten ein. Aber es gibt Möglichkeiten, dieses Problem zu umgehen. Wenn Sie nicht auf das Senden von Daten per FORM-Übermittlung beschränkt sind, können Sie das xmlhttp-Objekt (ein DOM-Objekt im XML-Set von Microsoft) verwenden, um das erforderliche XML zu senden:

var oXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
oXMLHTTP.open("POST", "xml_handler.asp", false);
oXMLHTTP.send(xml_to_send);


Da das Request-Objekt die IStream-Schnittstelle implementiert, können Sie das zu übermittelnde XML laden, indem Sie die Methode „load()“ des DOMDocument-Objekts verwenden:

Dim oDOM
Set oDOM = Server.CreateObject("MSXML2.DOMDocument")
oDOM.load Request


If Sie können diese Einschränkung nur mit FORM übermitteln, indem Sie mehrere TEXTAREA- oder INPUT-Daten übermitteln. Die ersten beiden können wieder zusammengesetzt werden, sobald der Server die FORM-Daten empfängt:

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


Dieser Codeabschnitt erstellt ein neues FORM-Element, um die Übermittlung von Daten zu verarbeiten, und platziert es im BODY-Element. Anschließend prüft es die Länge des XML-Codes, der an den Server übermittelt werden soll. Dieses XML befindet sich in einem TEXTAREA namens txtXML in someForm.

Wenn das XML größer als die 90.000 Zeichen umfassende MAXLEN-Datei ist, erstellt dieser Code mehrere versteckte INPUT-Elemente und setzt das Wertattribut auf die 90.000 Zeichen umfassenden XML-Daten oder setzt es auf a Geben Sie am Ende des XML-Codes einen Wert ein, um die Daten in mehrere Teile aufzuteilen. Wenn die Größe dieser XML-Datei kleiner als MAXLEN ist, erstellt dieser Code lediglich eine Eingabe und legt den Wert entsprechend fest. Diese Daten werden dann zur Verarbeitung an den Server übermittelt.

Sie haben vielleicht bemerkt, dass ich jedem Feld des neuen Formulars denselben Namen zugewiesen habe – txtXML. Dies hilft dabei, die XML-Daten von anderen Daten zu trennen, die möglicherweise übermittelt werden, und bietet eine einfache Möglichkeit, die XML-Daten neu zu organisieren. Beim Neuorganisieren der Daten benötigen Sie eine einfache Schleife, um die Daten in den Feldern zu verbinden:

Dim str, fld
For Each fld In Request.Form("txtXML")
    str = str & fld
Next


Da für jedes FORM-Element ein Feldsatz erstellt wurde, können Sie dies tun Iterieren Sie über Felder mit demselben Namen. Solange Sie FORM-Elemente auf der Clientseite in der richtigen Reihenfolge erstellen, müssen Sie sich keine Gedanken über die Reihenfolge machen, in der die Felder durchlaufen werden. Dies kann einfach über die appendChild()-Methode von FORM erreicht werden.

Daten werden auf dem Client von links nach rechts und von oben nach unten übermittelt. Wenn Sie also das INPUT-Element an das Ende des FORM-Elements anhängen, werden die Daten immer in derselben Reihenfolge empfangen.

Wenn Sie eine große Datenlösung implementieren möchten, z. B. die Übertragung großer Excel-Datenmengen vom Client-Computer auf den Server, sollten Sie noch einmal darüber nachdenken, ob Sie die FORM-Übermittlung verwenden oder die Daten logisch aufteilen möchten in kleinere Teile. Da Sie das Dateityp-INPUT-Element nicht verwenden können, besteht die kreativste Lösung darin, die Daten lokal in XML zu konvertieren und sie dann an den Server zu senden. Die Daten werden wiederum auf dem Server gespeichert, bis eine weitere Verarbeitung erforderlich ist.

Natürlich gibt es möglicherweise einen besseren Weg, dieses Problem zu lösen. Aber wenn Sie nicht viel Zeit haben, brauchen Sie nur eine schnelle, brauchbare Lösung.

Das Obige ist eine detaillierte Einführung in die Verwendung von XMLHTTP zum Senden ultralanger XML-Formulardaten. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn