Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung, wie Sie mit XMLHTTP extrem lange XML-Formulardaten senden

Ausführliche Erläuterung, wie Sie mit XMLHTTP extrem lange XML-Formulardaten senden

黄舟
黄舟Original
2017-03-27 17:03:431497Durchsuche

Wenn Sie eine große Menge an XML als Teil der POST-Daten an Ihren IIS-Server senden – beispielsweise im TEXTAREA des ASP-Formulars – erhalten Sie möglicherweise einige erwartete 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 darauf beschränkt sind, Daten nur per FORM-Übermittlung zu senden, können Sie XMLHTTPObject (ein DOM-Objekt im XML-Set von Microsoft) verwenden, um das zu senden, was Sie im XML-Format benötigen:

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

Wenn Sie darauf beschränkt sind, nur FORM zu senden, können Sie diese Einschränkung überwinden, indem Sie mehrere TEXTAREA- oder INPUT-Daten senden. 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);
}

Dieses Stück Der Code erstellt ein neues FORM-Element, um die Übermittlung von Daten zu verarbeiten, und platziert sie 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 90.000 Zeichen MAXLEN ist, erstellt dieser Code mehrere versteckte INPUT-Elemente und setzt das -Attribut des Werts auf die 90.000 Zeichen langen XML-Daten oder auf einen Wert bei am Ende des XML, 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 von 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, iterieren Sie über Felder mit demselben Name. 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 in der Reihenfolge von links nach rechts und von oben nach unten übermittelt. Wenn Sie also das INPUT-Element an das Ende des FORM-Elements anhängen, liegen sie auf Ihrem Server immer in derselben Reihenfolge vor . um Daten zu 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 der detaillierte Inhalt vonAusführliche Erläuterung, wie Sie mit XMLHTTP extrem lange XML-Formulardaten senden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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