當(dāng)前位置: 首頁IT技術(shù) → 關(guān)于ASP中大字段在Form中Post出錯的解析

關(guān)于ASP中大字段在Form中Post出錯的解析

更多

這篇文章將會介紹到關(guān)于ASP中大字段在Form中Post出錯的解析,希望對大家能夠有幫助。

我們在使用很多新聞系統(tǒng)的時候,都會發(fā)現(xiàn)一個問題,尤其是使用 HtmlEdit 從WORD文檔中直接拷貝文章(尤其里面有復(fù)雜表格和文字)的時候,提交會有一個錯誤發(fā)生。

"Request Object, ASP 0107 (0x80004005)"

很多編程人員都以為是 access 數(shù)據(jù)庫備注字段64kb限制的問題,開始 icech 也以為是,但是后來用了其他新聞系統(tǒng)的 SQL 版本,同樣的問題發(fā)生了。因此我猜想,可能是瀏覽器的問題。但是 Form 表單使用的都是 Post 方式,應(yīng)該和瀏覽器無關(guān),那是什么原因呢?

程序出錯提示總是在 Request.Form(“xxx”)的地方,因此我判斷,可能是Request有大小的限制。然后就去MSDN上查找“ASP 0107 (0x80004005)”,果然是Request的問題。微軟的原文是這樣的。

PRB: Error "Request Object, ASP 0107 (0x80004005)" When You Post a Form

The information in this article applies t

microsoft Active Server Pages

This article was previously published under Q273482

SYMPTOMS

When you post a large form field in Microsoft Internet Information Services 5.0, you may receive the following error message:

Error Type:

Request object, ASP 0107 (0x80004005)

The data being processed is over the allowed limit.

When you post a large form field in Microsoft Internet Information Server 4.0, you may receive the following error message:

Request object error 'ASP 0107 : 80004005'

Stack Overflow

/projectname/page.asp, line XX

The data being processed is over the allowed limit.

CAUSE

The size limit of each form field that is retrieved in the Request object is 102,399 bytes. The error occurs when you exceed this limit.

RESOLUTION

To resolve this problem, use one of the following methods:

Instead of reading form variable values with the Request.Form collection, use Request.BinaryRead (Request.TotalBytes), and parse the form values from the output of Request.BinaryRead.

Use a File Upload scheme, such as Microsoft Posting Acceptor.

Break the HTML form variables into multiple form variables before you submit the form. The 102,399 byte limit is for each form variable, so you can have multiple form variables of 102,399 characters or less. The following sample code illustrates this: WARNING: ANY USE BY YOU OF THE CODE PROVIDED IN THIS ARTICLE IS AT YOUR OWN RISK. Microsoft provides this code "as is" without warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability and/or fitness for a particular purpose.

<FORM method=post action=LargePost.asp name=theForm onsubmit="BreakItUp()">

<Textarea rows=3 cols=100 name=BigTextArea>A bunch of text...</Textarea>

<input type=submit value=go>

</form>

<SCRIPT Language=java script>

function BreakItUp()

{

//Set the limit for field size.

var FormLimit = 102399

//Get the value of the large input object.

var TempVar = new String

TempVar = document.theForm.BigTextArea.value

//If the length of the object is greater than the limit, break it

//into multiple objects.

if (TempVar.length > FormLimit)

{

document.theForm.BigTextArea.value = TempVar.substr(0, FormLimit)

TempVar = TempVar.substr(FormLimit)

while (TempVar.length > 0)

{

var objTEXTAREA = document.createElement("TEXTAREA")

objTEXTAREA.name = "BigTextArea"

objTEXTAREA.value = TempVar.substr(0, FormLimit)

document.theForm.appendChild(objTEXTAREA)

TempVar = TempVar.substr(FormLimit)

}

}

}

</SCRIPT>

The receiving Active Server Page (ASP) page reconstructs the variable:

<%

Dim BigTextArea

For I = 1 To Request.Form("BigTextArea").Count

BigTextArea = BigTextArea & Request.Form("BigTextArea")(I)

Next

%>

100 K的限制?微軟竟然來這一手!幸好他們自己給出了幾個解決方案,看一下上文可以知道,微軟提供了2種可行的方法:

第一種使用Request.BinaryRead (Request.TotalBytes),第二種使用分段上傳的方式,基于少更改程序的原則,我們采用第二種方式。但是在使用的過程中,icech無意中發(fā)現(xiàn),直接使用

For I = 1 To Request.Form("BigTextArea").Count

BigTextArea = BigTextArea & Request.Form("BigTextArea")(I)

Next

來代替Request.Form("BigTextArea")竟然也能達(dá)到同樣的效果!驚奇!我想可能系統(tǒng)每次將100K的內(nèi)容發(fā)送給Request,上段程序又在進(jìn)行循環(huán),因此達(dá)到了同樣的效果。

以上是icech解決問題的方法,現(xiàn)在新聞系統(tǒng)例如:喬客、動力、惠信比較好的系統(tǒng)也都存在這個問題,大家可以試著用這種方法來解決。

下面再給大家提供一個我在CSDN上發(fā)現(xiàn)的一個帖子,和我寫的異曲同工,解決了一樣的問題,方法也一樣,供參考:

如何在Form域中Post大于100K字節(jié)的數(shù)據(jù)????

以前在工作中遇到一個問題,當(dāng)表單發(fā)送的數(shù)據(jù)量很大時,就會報錯。查閱MSDN了解到,原因是微軟對用Request.Form()可接收的最大數(shù)據(jù)限制為100K字節(jié)。

微軟建議用Request.BinaryRead()讀取表單數(shù)據(jù),但由于這種方法讀出的是二進(jìn)制數(shù)據(jù),需要對讀出的數(shù)據(jù)逐字節(jié)進(jìn)行分析,生成有意義的字符串(MSDN上的一段程序就是這樣寫的,但它并沒有考慮諸如標(biāo)點(diǎn)符號等轉(zhuǎn)義字符需要進(jìn)行特殊分析)。如果說這種方法對于純英文系統(tǒng)勉強(qiáng)可用的話,則對于中文系統(tǒng)來說就有極大的麻煩,因為漢字是用兩個字節(jié)表示的,而讀出的二進(jìn)制數(shù)據(jù)本身并不能判斷是英文還是漢字(否則就不是二進(jìn)制數(shù)據(jù),而是字符串了^-^)。這樣的話就必須了解漢字的編碼規(guī)律才能進(jìn)行分析。最后,即使算法上能把這些都分析出來,大家想想對于一個MB級的巨型字符串逐字節(jié)進(jìn)行分析,其效率何如?所以,此路不通!

不過,辦法總是有的。一開始我以為是整個表單數(shù)據(jù)的總和不能超過100KB,后來發(fā)現(xiàn)這是對表單內(nèi)每個域的限制。問題的解決辦法是,對于一個需要發(fā)送大數(shù)據(jù)的域,在提交表單前將數(shù)據(jù)拆分為小于限額的數(shù)份,分別放在數(shù)個hidden域中,同時把原有域清空,再正式提交表單。服務(wù)器端還是用Request.Form()讀取各hidden域的數(shù)據(jù),再按照順序把他們拼接起來就行了。主要代碼如下:

注意:需要在Form中的HTML代碼內(nèi)指定一個DIV,以便向其中動態(tài)插入hidden域。

====客戶端示例代碼====

<script language=java script>

//數(shù)據(jù)拆分,并放到相應(yīng)的hidden域中,在Form的onSubmit事件中激發(fā)

function fnPreHandle()

{

var iCount; //拆分為多少個域

var strData; //原始數(shù)據(jù)

var iMaxChars = 50000;//考慮到漢字為雙字節(jié),域的最大字符數(shù)限制為50K

var iBottleNeck = 2000000;//如果文章超過2M字,需要提示用戶

var strHTML;

//原始數(shù)據(jù)

strData = frmTest.BigField.value;

//如果文章實在太長,需要提醒用戶

if (strData.length > iBottleNeck)

{

if (confirm("您要發(fā)布的文章太長,建議您拆分為幾部分分別發(fā)布。\n如果您堅持提交,注意需要較長時間才能提交成功。\n\n是否堅持提交?") == false)

return false;

}

iCount = parseInt(strData.length / iMaxChars) + 1;

//hdnCount記錄原數(shù)據(jù)域拆分為多少個子域

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 + ">";

}

//在Form中DIV(divHidden)內(nèi)動態(tài)插入各hidden域的HTML代碼

document.all.divHidden.innerHTML = strHTML;

//給各子域賦值

for (var i = 1; i <= iCount; i++)

{

frmTest.elements["hdnBigField" + i].value = strData.substring((i - 1) * iMaxChars, i * iMaxChars);

}

//原數(shù)據(jù)域清空

frmTest.BigField.value = "";

}

</script>

====服務(wù)器端示例代碼====

<%

Dim strData

Dim intFieldCount

Dim i

intFieldCount = Request.Form("hdnCount")

For i=1 To intFieldCount

strData = strData & Request.Form("hdnBigfield" & i)

Next

Response.Write strData

%>

你說微軟為什么要有個100KB的限制呢?渾!

熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)