لقد واجهت مشكلة في العمل من قبل عندما كانت كمية البيانات المرسلة بواسطة النموذج كبيرة، سيتم الإبلاغ عن خطأ. عند التحقق من MSDN، علمنا أن السبب هو أن Microsoft تحدد الحد الأقصى للبيانات التي يمكن تلقيها باستخدام Request.Form() بـ 100 كيلو بايت. توصي Microsoft باستخدام Request.BinaryRead() لقراءة بيانات النموذج، ولكن بما أن هذه الطريقة تقرأ البيانات الثنائية، فإن بيانات القراءة تحتاج إلى تحليل بايت تلو الآخر لإنشاء سلسلة ذات معنى (يتم كتابة برنامج على MSDN بهذه الطريقة، ولكنه يفعل ذلك لا تأخذ في الاعتبار أن الأحرف التي تم تجاوزها مثل علامات الترقيم تتطلب تحليلاً خاصًا). إذا كانت هذه الطريقة قابلة للاستخدام بالكاد مع الأنظمة الإنجليزية البحتة، فستكون مزعجة للغاية بالنسبة للأنظمة الصينية، لأن الأحرف الصينية يتم تمثيلها ببايتين، ولا يمكن للبيانات الثنائية المقروءة نفسها تحديد ما إذا كانت أحرفًا إنجليزية أو صينية (وإلا فستكون لا تكون بيانات ثنائية، بل سلسلة ^-^). وفي هذه الحالة، يجب عليك فهم قواعد ترميز الأحرف الصينية حتى تتمكن من إجراء التحليل. أخيرًا، حتى لو كانت الخوارزمية قادرة على تحليل كل ذلك، فكر في مدى كفاءة تحليل بايت بايت من سلسلة عملاقة على مستوى ميغابايت؟ وبالتالي هذا الطريق مسدود!
ومع ذلك، هناك دائما طريقة. في البداية اعتقدت أن إجمالي بيانات النموذج لا يمكن أن يتجاوز 100 كيلو بايت، لكنني اكتشفت لاحقًا أن هذا كان الحد الأقصى لكل حقل في النموذج. حل المشكلة هو أنه بالنسبة للمجال الذي يحتاج إلى إرسال بيانات ضخمة، قم بتقسيم البيانات إلى عدة أجزاء أصغر من الحد الأقصى قبل إرسال النموذج، ووضعها في عدة حقول مخفية، ومسح الحقول الأصلية في نفس الوقت، ثم تقديم النموذج رسميا. لا يزال الخادم يستخدم Request.Form() لقراءة البيانات الموجودة في كل حقل مخفي، ثم ربطها معًا بالترتيب. الرمز الرئيسي هو كما يلي:
ملاحظة: تحتاج إلى تحديد DIV ضمن تعليمات HTML البرمجية في النموذج لإدراج الحقل المخفي فيه ديناميكيًا.
====رمز عينة العميل====
انسخ رمز الكود كما يلي:
<لغة البرنامج النصي=جافا سكريبت>
// يتم تقسيم البيانات ووضعها في المجال المخفي المقابل، والذي يتم تشغيله في حدث onSubmit الخاص بالنموذج
الدالة fnPreHandle()
{
var iCount; // كم عدد المجالات المراد تقسيمها
فار سترداتا // البيانات الأصلية
var iMaxChars = 50000;// بالنظر إلى أن الأحرف الصينية عبارة عن بايتات مزدوجة، فإن الحد الأقصى لعدد الأحرف في المجال يقتصر على 50 كيلو بايت
var iBottleNeck = 2000000; // إذا تجاوزت المقالة 2 مليون كلمة، فيجب مطالبة المستخدم
فار strHTML;// البيانات الأصلية
strData = frmTest.BigField.value;// إذا كانت المقالة طويلة جدًا، فيجب تذكير المستخدم
إذا (strData.length > iBottleNeck)
{
إذا (تأكيد)(المقالة التي تريد نشرها طويلة جدًا، فمن المستحسن أن تقوم بتقسيمها إلى عدة أجزاء ونشرها بشكل منفصل./nإذا كنت تصر على الإرسال، يرجى ملاحظة أن إرسالها بنجاح سيستغرق وقتًا طويلاً./ ن/ن هل تصر على التقديم؟) == خطأ )
عودة كاذبة.
}iCount = parseInt(strData.length / iMaxChars) + 1;//hdnCount يسجل عدد الحقول الفرعية التي تم تقسيم حقل البيانات الأصلي إليها
strHTML = <input type=hidden name=hdnCount value= + iCount + >;// إنشاء كود HTML لكل مجال فرعي
لـ (var i = 1; i <= iCount; i++)
{
strHTML = strHTML + /n + <input type=hidden name=hdnBigField + i + >;
}// أدخل كود HTML لكل مجال مخفي ديناميكيًا في DIV (divHidden) في النموذج
document.all.divHidden.innerHTML = strHTML;// تعيين قيم لكل مجال فرعي
لـ (var i = 1; i <= iCount; i++)
{
frmTest.elements[hdnBigField + i].value = strData.substring((i - 1) * iMaxChars, i * iMaxChars);
}//امسح حقل البيانات الأصلي
frmTest.BigField.value = ;
}
</النص>
====نموذج التعليمات البرمجية من جانب الخادم====
انسخ رمز الكود كما يلي:
<%
خافت strData
خافت عدد الحقول
Dim iintFieldCount = Request.Form(hdnCount)For i=1 إلى intFieldCount
strData = strData & Request.Form(hdnBigfield & i)
NextResponse.اكتب strData
%>