ASP フォームの TEXTAREA などで、POST データの一部として IIS サーバーに大量の XML を送信すると、予期しない結果が生じる可能性があります。データがサーバー上で処理されるとき、データの処理方法が原因でエラーが発生する可能性があります。その理由は、データをサーバーに送信するときに、POST フィールドに (データ) サイズ制限があるためです。この目的は、侵入者がサービス拒否 (DoS) 攻撃でサーバーに非常に大量のデータを送信するのを防ぐことです。
この制限により、あなたの能力も制限されます。しかし、この問題を回避する方法はあります。 FORM 送信によるデータ送信のみに限定されない場合は、xmlhttp オブジェクト (Microsoft の 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 制限を送信することでこれを越えることができます。最初の 2 つは次のようにすることができます。サーバーがこの 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 要素を作成し、value 属性を 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() メソッドを使用して簡単に実行できます。
データはクライアントでは左から右、上から下の順序で送信されるため、FORM 要素の最後に INPUT 要素を追加すると、サーバー上では常に同じ順序でデータが送信されます。 。
大量の Excel データをクライアント マシンからサーバーに転送するなど、大規模なデータ ソリューションの実装を検討している場合は、FORM 送信を使用するか、データを論理的に複数の小さな部分に分割するかを再検討する必要があります。ファイル タイプの INPUT 要素は使用できないため、最も創造的な解決策は、データをローカルで XML に変換し、その XML データをサーバーに送信することです。さらに、データはさらなる処理が必要になるまでサーバーに保存されます。
もちろん、この問題を処理するより良い方法があるかもしれません。しかし、時間があまりない場合に必要なのは、すぐに使える解決策だけです。
上記は、XMLHTTP を使用して超長い XML フォーム データを送信する方法の詳細です。その他の関連コンテンツについては、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。