이전에 직장에서 문제가 발생했습니다. 양식에서 전송된 데이터의 양이 많을 때 오류가 보고되었습니다. MSDN을 확인해보니 Microsoft가 Request.Form()을 사용하여 수신할 수 있는 최대 데이터를 100K 바이트로 제한하기 때문이라는 것을 알게 되었습니다. Microsoft에서는 양식 데이터를 읽으려면 Request.BinaryRead()를 사용할 것을 권장하지만 이 방법은 바이너리 데이터를 읽기 때문에 읽은 데이터를 바이트 단위로 분석하여 의미 있는 문자열을 생성해야 합니다(MSDN의 프로그램은 이런 방식으로 작성되어 있지만 실제로는 그렇지 않습니다). 구두점과 같은 이스케이프 문자에는 특별한 분석이 필요하다는 점을 고려하지 마십시오. 이 방법을 순수 영어 시스템에서는 거의 사용할 수 없다면 중국어 시스템에서는 매우 번거로울 것입니다. 왜냐하면 한자는 2바이트로 표현되고, 읽은 바이너리 데이터 자체로는 그것이 영어인지 아니면 영어인지 판단할 수 없기 때문입니다. 이진 데이터가 아니라 문자열 ^-^)입니다. 이 경우 분석을 위해서는 한자의 인코딩 규칙을 이해해야 합니다. 마지막으로, 알고리즘이 이 모든 것을 분석할 수 있다고 하더라도 MB 수준의 거대한 문자열을 바이트 단위로 분석하는 것이 얼마나 효율적인지 생각해 보세요. 그러므로 이 길은 막혀있습니다!
그러나 항상 방법이 있습니다. 처음에는 전체 양식 데이터가 100KB를 초과할 수 없다고 생각했는데 나중에 이것이 양식의 각 필드에 대한 제한이라는 것을 알게 되었습니다. 문제의 해결 방법은 빅데이터를 전송해야 하는 도메인의 경우 양식을 제출하기 전에 데이터를 한도보다 작은 여러 부분으로 분할하여 여러 개의 숨겨진 필드에 배치하고 동시에 원본 필드를 지운 다음 공식적으로 양식을 제출합니다. 서버는 여전히 Request.Form()을 사용하여 각 숨겨진 필드의 데이터를 읽은 다음 순서대로 연결합니다. 주요 코드는 다음과 같습니다.
참고: 숨겨진 필드를 동적으로 삽입하려면 양식의 HTML 코드 내에 DIV를 지정해야 합니다.
====클라이언트 샘플 코드====
다음과 같이 코드 코드를 복사합니다.
<SCRIPT 언어=자바스크립트>
//데이터가 분할되어 해당 숨겨진 도메인에 배치되며 이는 양식의 onSubmit 이벤트에서 트리거됩니다.
함수 fnPreHandle()
{
var iCount; //분할할 도메인 수
var strData; //원본 데이터
var iMaxChars = 50000;//한자는 2바이트라는 점을 고려하여 도메인의 최대 문자 수는 50K로 제한됩니다.
var iBottleNeck = 2000000; //기사가 2백만 단어를 초과하면 사용자에게 메시지를 표시해야 합니다.
var strHTML;//원본 데이터
strData = frmTest.BigField.value;//글이 너무 길면 사용자에게 상기시켜야 합니다.
if (strData.length > iBottleNeck)
{
if (확인(게재하고 싶은 글이 너무 깁니다. 여러 부분으로 나누어서 따로 게재하는 것을 권장합니다./n꼭 투고할 경우 성공적으로 투고하는 데 시간이 오래 걸린다는 점 참고하시기 바랍니다./ n/n제출을 고집하시나요?) == false )
거짓을 반환;
}iCount = parsInt(strData.length / iMaxChars) + 1;//hdnCount는 원본 데이터 필드가 분할된 하위 필드 수를 기록합니다.
strHTML = <입력 유형=숨겨진 이름=hdnCount 값= + iCount + >;//각 하위 도메인에 대한 HTML 코드 생성
for (var i = 1; i <= iCount; i++)
{
strHTML = strHTML + /n + <입력 유형=숨겨진 이름=hdnBigField + i + >;
}//각 숨겨진 도메인의 HTML 코드를 양식의 DIV(divHidden)에 동적으로 삽입합니다.
document.all.divHidden.innerHTML = strHTML;//각 하위 도메인에 값 할당
for (var i = 1; i <= iCount; i++)
{
frmTest.elements[hdnBigField + i].value = strData.substring((i - 1) * iMaxChars, i * iMaxChars);
}//원본 데이터 필드 지우기
frmTest.BigField.value = ;
}
</SCRIPT>
====서버측 샘플 코드====
다음과 같이 코드 코드를 복사합니다.
<%
희미한 strData
Dim intFieldCount
Dim iintFieldCount = Request.Form(hdnCount)For i=1 To intFieldCount
strData = strData & Request.Form(hdnBigfield & i)
NextResponse.Write strData
%>