Раньше я сталкивался с проблемой на работе. Когда объем данных, отправленных через форму, был большим, сообщалось об ошибке. Проверив MSDN, мы узнали, что причина в том, что Microsoft ограничивает максимальный размер данных, которые можно получить с помощью Request.Form(), 100 КБ. Microsoft рекомендует использовать Request.BinaryRead() для чтения данных формы, но поскольку этот метод считывает двоичные данные, считанные данные необходимо анализировать побайтно, чтобы сгенерировать осмысленную строку (программа в MSDN написана таким образом, но это не так). не принимать во внимание, что экранированные символы, такие как знаки препинания, требуют специального анализа). Если этот метод вряд ли можно использовать для чисто английских систем, то для китайских систем он будет очень проблематичным, поскольку китайские иероглифы представлены двумя байтами, а сами считанные двоичные данные не могут определить, являются ли это английскими или английскими китайскими иероглифами (в противном случае это было бы невозможно). это не двоичные данные, а строка ^-^). В этом случае вам необходимо понять правила кодирования китайских иероглифов, чтобы выполнить анализ. Наконец, даже если алгоритм сможет проанализировать все это, подумайте, насколько эффективно анализировать гигантскую строку уровня МБ побайтово? Поэтому эта дорога заблокирована!
Однако всегда есть способ. Сначала я думал, что общий размер данных формы не может превышать 100 КБ, но позже я узнал, что это ограничение для каждого поля формы. Решение проблемы заключается в том, что для домена, которому необходимо отправлять большие данные, перед отправкой формы разбейте данные на несколько частей, меньших лимита, поместите их в несколько скрытых полей, одновременно очистите исходные поля, а затем официально отправить форму. Сервер по-прежнему использует Request.Form() для чтения данных в каждом скрытом поле, а затем объединяет их по порядку. Основной код выглядит следующим образом:
Примечание. Вам необходимо указать DIV в HTML-коде формы, чтобы динамически вставлять в нее скрытое поле.
====Пример кода клиента====
Скопируйте код кода следующим образом:
<Язык СКРИПТА=JavaScript>
//Данные разделяются и помещаются в соответствующий скрытый домен, который запускается в событии onSubmit формы.
функция fnPreHandle()
{
var iCount; //На сколько доменов разделить
вар strData; //исходные данные;
var iMaxChars = 50000;//Учитывая, что китайские иероглифы представляют собой двухбайтовые символы, максимальное количество символов в домене ограничено 50 КБ
var iBottleNeck = 2000000 //Если статья превышает 2 миллиона слов, пользователю необходимо указать это.
var strHTML;//исходные данные
strData = frmTest.BigField.value;//Если статья слишком длинная, нужно напомнить пользователю
если (strData.length > iBottleNeck)
{
if (confirm(Статья, которую вы хотите опубликовать, слишком длинная, рекомендуется разделить ее на несколько частей и опубликовать их отдельно./nЕсли вы настаиваете на отправке, обратите внимание, что для успешной отправки потребуется много времени./ n/nВы настаиваете на отправке?) == false )
вернуть ложь;
}iCount = parseInt(strData.length / iMaxChars) + 1; //hdnCount записывает, на сколько подполей разбито исходное поле данных
strHTML = <input type=hidden name=hdnCount value= + iCount + >;//Сгенерировать HTML-код для каждого поддомена
for (var я = 1; я <= iCount; я++)
{
strHTML = strHTML + /n + <тип ввода=скрытое имя=hdnBigField + i + >;
}//Динамически вставляем HTML-код каждого скрытого домена в DIV (divHidden) в форме.
document.all.divHidden.innerHTML = strHTML;//Назначаем значения каждому поддомену
for (var я = 1; я <= iCount; я++)
{
frmTest.elements[hdnBigField + i].value = strData.substring((i - 1) * iMaxChars, i * iMaxChars);
}//Очистка исходного поля данных
frmTest.BigField.value = ;
}
</СКРИПТ>
====Пример кода на стороне сервера====
Скопируйте код кода следующим образом:
<%
Дим стрдата
Dim intFieldCount
Dim iintFieldCount = Request.Form(hdnCount) Для i=1 Для intFieldCount
strData = strData & Request.Form(hdnBigfield & i)
NextResponse.Write strData
%>