ฉันเคยประสบปัญหาในที่ทำงานมาก่อน เมื่อปริมาณข้อมูลที่ส่งโดยแบบฟอร์มมีจำนวนมาก ข้อผิดพลาดจะถูกรายงาน จากการตรวจสอบ MSDN เราได้เรียนรู้ว่าเหตุผลก็คือ Microsoft จำกัดข้อมูลสูงสุดที่สามารถรับได้โดยใช้ Request.Form() ไว้ที่ 100K ไบต์ Microsoft ขอแนะนำให้ใช้ Request.BinaryRead() เพื่ออ่านข้อมูลในแบบฟอร์ม แต่เนื่องจากวิธีนี้อ่านข้อมูลไบนารี ข้อมูลการอ่านจึงต้องได้รับการวิเคราะห์ทีละไบต์เพื่อสร้างสตริงที่มีความหมาย (โปรแกรมบน MSDN ถูกเขียนด้วยวิธีนี้ แต่ทำ ไม่คำนึงว่าอักขระที่ใช้ Escape เช่น เครื่องหมายวรรคตอน จำเป็นต้องมีการวิเคราะห์เป็นพิเศษ) หากวิธีนี้ใช้ไม่ได้กับระบบภาษาอังกฤษล้วนๆ จะลำบากมากสำหรับระบบภาษาจีน เนื่องจากอักขระภาษาจีนแสดงเป็น 2 ไบต์ และข้อมูลไบนารี่ที่อ่านเองก็ไม่สามารถระบุได้ว่าเป็นอักขระภาษาอังกฤษหรือภาษาอังกฤษ (ไม่เช่นนั้นจะเป็นเช่นนั้น) ไม่ใช่ข้อมูลไบนารี แต่เป็นสตริง ^-^) ในกรณีนี้ คุณต้องเข้าใจกฎการเข้ารหัสของตัวอักษรจีนเพื่อทำการวิเคราะห์ สุดท้ายนี้ แม้ว่าอัลกอริธึมจะสามารถวิเคราะห์สิ่งเหล่านี้ได้ ลองคิดดูว่าการวิเคราะห์ไบต์สตริงขนาดยักษ์ระดับ MB ต่อไบต์จะมีประสิทธิภาพเพียงใด ถนนเส้นนี้จึงถูกปิดกั้น!
อย่างไรก็ตาม ยังมีหนทางอยู่เสมอ ตอนแรกฉันคิดว่าข้อมูลในแบบฟอร์มทั้งหมดต้องไม่เกิน 100KB แต่ต่อมาฉันพบว่านี่เป็นขีดจำกัดสำหรับแต่ละฟิลด์ในแบบฟอร์ม วิธีแก้ปัญหาคือสำหรับโดเมนที่ต้องการส่งข้อมูลขนาดใหญ่ ให้แบ่งข้อมูลออกเป็นหลายส่วนที่เล็กกว่าขีดจำกัดก่อนที่จะส่งแบบฟอร์ม วางไว้ในช่องที่ซ่อนอยู่หลายๆ ช่อง ล้างช่องต้นฉบับพร้อมกัน จากนั้น ส่งแบบฟอร์มอย่างเป็นทางการ เซิร์ฟเวอร์ยังคงใช้ Request.Form() เพื่ออ่านข้อมูลในแต่ละฟิลด์ที่ซ่อนอยู่ จากนั้นจึงประกบเข้าด้วยกันตามลำดับ รหัสหลักมีดังนี้:
หมายเหตุ: คุณต้องระบุ DIV ภายในโค้ด HTML ในแบบฟอร์มเพื่อแทรกฟิลด์ที่ซ่อนไว้แบบไดนามิก
====โค้ดตัวอย่างลูกค้า====
คัดลอกรหัสรหัสดังต่อไปนี้:
<ภาษาสคริปต์=จาวาสคริปต์>
//ข้อมูลจะถูกแบ่งและวางไว้ในโดเมนที่ซ่อนอยู่ซึ่งจะถูกทริกเกอร์ในเหตุการณ์ onSubmit ของแบบฟอร์ม
ฟังก์ชั่น fnPreHandle()
-
var iCount; //จำนวนโดเมนที่จะแบ่งออกเป็น
var strData; //ข้อมูลต้นฉบับ
var iMaxChars = 50000;//เมื่อพิจารณาว่าอักขระภาษาจีนเป็นไบต์คู่ จำนวนอักขระสูงสุดในโดเมนจึงจำกัดอยู่ที่ 50K
var iBottleneck = 2000000; //หากบทความยาวเกิน 2 ล้านคำ ผู้ใช้จะต้องได้รับแจ้ง
var strHTML;//ข้อมูลต้นฉบับ
strData = frmTest.BigField.value;//หากบทความยาวเกินไป ผู้ใช้จำเป็นต้องได้รับการเตือน
ถ้า (strData.length > iBottleneck)
-
ถ้า (ยืนยัน(บทความที่คุณต้องการเผยแพร่ยาวเกินไป ขอแนะนำให้คุณแบ่งออกเป็นหลายส่วนและเผยแพร่แยกกัน/nหากคุณยืนยันในการส่ง โปรดทราบว่าจะใช้เวลานานในการส่งให้สำเร็จ/ n/nคุณยืนยันที่จะส่งหรือไม่?) == false )
กลับเท็จ;
}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 + <ประเภทอินพุต=ชื่อที่ซ่อนอยู่=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 intFieldCount
Dim iintFieldCount = Request.Form(hdnCount)For i=1 ถึง intFieldCount
strData = strData & คำขอแบบฟอร์ม (hdnBigfield & i)
NextResponse.เขียน strData
-