以前、フォームから送信されるデータ量が多いとエラーが報告されるという問題に遭遇しました。 MSDN を確認したところ、その理由は Microsoft が Request.Form() を使用して受信できる最大データを 100K バイトに制限しているためであることがわかりました。 Microsoft では、フォーム データの読み取りに Request.BinaryRead() を使用することを推奨していますが、このメソッドはバイナリ データを読み取るため、読み取ったデータをバイトごとに分析して意味のある文字列を生成する必要があります (MSDN のプログラムはこのように書かれていますが、実際には句読点などのエスケープ文字には特別な分析が必要であることは考慮されていません)。この方法が純粋な英語のシステムではかろうじて使用可能であるとしても、中国語のシステムでは非常に厄介になります。なぜなら、中国語の文字は 2 バイトで表現され、読み取られたバイナリ データ自体では、それが英語か英語の文字かを判断できないからです (そうでないと判断されてしまいます)。バイナリ データではなく文字列 ^-^)。この場合、解析を行うためには漢字のエンコード規則を理解する必要があります。最後に、アルゴリズムがこれらすべてを分析できるとしても、MB レベルの巨大な文字列をバイトごとに分析することがどれほど効率的であるかを考えてみてください。したがって、この道は通行止めになっています!
ただし、必ず方法はあります。最初はフォーム データの合計が 100KB を超えてはいけないのだと思っていましたが、後でこれがフォーム内の各フィールドの制限であることがわかりました。この問題の解決策は、大きなデータを送信する必要があるドメインの場合、フォームを送信する前にデータを制限より小さいいくつかの部分に分割し、それらをいくつかの非表示フィールドに配置し、元のフィールドを同時にクリアします。フォームを正式に送信します。サーバーは依然として Request.Form() を使用して各非表示フィールドのデータを読み取り、それらを順番に結合します。メインのコードは次のとおりです。
注: 非表示フィールドを動的に挿入するには、フォームの HTML コード内で DIV を指定する必要があります。
====クライアントのサンプルコード====
次のようにコードをコピーします。
<SCRIPT言語=javascript>
// データは分割され、対応する非表示ドメインに配置され、フォームの onSubmit イベントでトリガーされます。
関数 fnPreHandle()
{
var iCount; // 分割するドメインの数
var strData; //元のデータ
var iMaxChars = 50000;//中国語の文字が 2 バイトであることを考慮すると、ドメイン内の最大文字数は 50K に制限されます
var iBottleNeck = 2000000; //記事が 200 万ワードを超える場合は、ユーザーにプロンプトを表示する必要があります。
var strHTML;//元のデータ
strData = frmTest.BigField.value;//記事が長すぎる場合は、ユーザーに通知する必要があります
if (strData.length > iBottleNeck)
{
if (confirm(公開したい記事は長すぎます。複数のパートに分けて個別に公開することをお勧めします。/nどうしても投稿する場合は、正常に送信するまでに時間がかかることに注意してください。/ n/n送信することを主張しますか?) == false )
false を返します。
}iCount = parseInt(strData.length / iMaxChars) + 1;//hdnCount は、元のデータ フィールドが分割されるサブフィールドの数を記録します。
strHTML = <input type=hidden name=hdnCount value= + iCount + >;//各サブドメインの HTML コードを生成します
for (var i = 1; i <= iCount; i++)
{
strHTML = strHTML + /n + <input type=hidden name=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 = ;
}
</スクリプト>
====サーバーサイドのサンプルコード====
次のようにコードをコピーします。
<%
ディム strData
Dim intFieldCount
Dim iintFieldCount = Request.Form(hdnCount)For i=1 To intFieldCount
strData = strData & Request.Form(hdnBigfield & i)
NextResponse.StrData の書き込み
%>