XMLHTTP를 사용하여 매우 긴 XML 형식 데이터를 보내는 방법에 대한 자세한 설명

黄舟
풀어 주다: 2017-03-27 17:03:43
원래의
1500명이 탐색했습니다.

POST 데이터의 일부로 IIS 서버에 대량의 XML을 보내는 경우(예: ASP 형식의 TEXTAREA) 예상한 결과를 얻을 수 있습니다. 서버에서 데이터를 처리할 때 데이터 처리 방식으로 인해 오류가 발생할 수 있습니다. 그 이유는 서버에 데이터를 다시 제출할 때 POST 필드에 (데이터) 크기 제한이 있기 때문입니다. 이것의 목적은 침입자가 서비스 거부(DoS) 공격으로 서버에 엄청난 양의 데이터를 보내는 것을 방지하는 것입니다.

이 제한은 또한 귀하의 능력을 제한합니다. 하지만 이 문제를 해결할 수 있는 방법이 있습니다. FORM 제출을 통해서만 데이터를 보내는 것으로 제한되지 않는다면 XMLHTTPObject(Microsoft XML 세트의 DOM Object)를 사용하여 필요한 XML을 보낼 수 있습니다:

var oXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
oXMLHTTP.open("POST", "xml_handler.asp", false);
oXMLHTTP.send(xml_to_send);
로그인 후 복사

요청 개체는 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 데이터를 서버에 제출하는 것입니다. 그러면 데이터는 추가 처리가 필요할 때까지 서버에 저장됩니다.

물론 이 문제를 처리하는 더 좋은 방법이 있을 수 있습니다. 하지만 시간이 많지 않을 때 필요한 것은 빠르고 사용 가능한 솔루션뿐입니다.

위 내용은 XMLHTTP를 사용하여 매우 긴 XML 형식 데이터를 보내는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!