ASP教程之进修ASP之办理年夜字段在Form中Post堕落的...
ASP是依赖组件的,能访问数据库的组件好多就有好多种,再有就是你微软的工具可是什么都要收钱的啊!年夜字|办理我们在利用良多旧事体系的时分,城市发明一个成绩,特别是利用HtmlEdit从WORD文档中间接拷贝文章(特别内里有庞大表格和笔墨)的时分,提交会有一个毛病产生。"RequestObject,ASP0107(0x80004005)"
良多编程职员都觉得是Access数据库备注字段64kb限定的成绩,入手下手icech也觉得是,可是厥后用了其他旧事体系的SQL版本,一样的成绩产生了。因而我料想,多是扫瞄器的成绩。可是Form表单利用的都是Post体例,应当和扫瞄器有关,那是甚么缘故原由呢?
程序堕落提醒老是在Request.Form(“xxx”)的中央,因而我判别,多是Request有巨细的限定。然后就往MSDN上查找“ASP0107(0x80004005)”,公然是Request的成绩。微软的原文是如许的。
PRB:Error"RequestObject,ASP0107(0x80004005)"WhenYouPostaForm
Theinformationinthisarticleappliest
MicrosoftActiveServerPages
ThisarticlewaspreviouslypublishedunderQ273482
SYMPTOMS
WhenyoupostalargeformfieldinMicrosoftInternetInformationServices5.0,youmayreceivethefollowingerrormessage:
ErrorType:
Requestobject,ASP0107(0x80004005)
Thedatabeingprocessedisovertheallowedlimit.
WhenyoupostalargeformfieldinMicrosoftInternetInformationServer4.0,youmayreceivethefollowingerrormessage:
RequestobjecterrorASP0107:80004005
StackOverflow
/projectname/page.asp,lineXX
Thedatabeingprocessedisovertheallowedlimit.
CAUSE
ThesizelimitofeachformfieldthatisretrievedintheRequestobjectis102,399bytes.Theerroroccurswhenyouexceedthislimit.
RESOLUTION
Toresolvethisproblem,useoneofthefollowingmethods:
InsteadofreadingformvariablevalueswiththeRequest.Formcollection,useRequest.BinaryRead(Request.TotalBytes),andparsetheformvaluesfromtheoutputofRequest.BinaryRead.
UseaFileUploadscheme,suchasMicrosoftPostingAcceptor.
BreaktheHTMLformvariablesintomultipleformvariablesbeforeyousubmittheform.The102,399bytelimitisforeachformvariable,soyoucanhavemultipleformvariablesof102,399charactersorless.Thefollowingsamplecodeillustratesthis:WARNING:ANYUSEBYYOUOFTHECODEPROVIDEDINTHISARTICLEISATYOUROWNRISK.Microsoftprovidesthiscode"asis"withoutwarrantyofanykind,eitherexpressorimplied,includingbutnotlimitedtotheimpliedwarrantiesofmerchantabilityand/orfitnessforaparticularpurpose.
<FORMmethod=postaction=LargePost.aspname=theForm>
<Textarearows=3cols=100name=BigTextArea>Abunchoftext...</Textarea>
<inputtype=submitvalue=go>
</form>
<SCRIPTLanguage=JavaScript>
functionBreakItUp()
{
//Setthelimitforfieldsize.
varFormLimit=102399
//Getthevalueofthelargeinputobject.
varTempVar=newString
TempVar=document.theForm.BigTextArea.value
//Ifthelengthoftheobjectisgreaterthanthelimit,breakit
//intomultipleobjects.
if(TempVar.length>FormLimit)
{
document.theForm.BigTextArea.value=TempVar.substr(0,FormLimit)
TempVar=TempVar.substr(FormLimit)
while(TempVar.length>0)
{
varobjTEXTAREA=document.createElement("TEXTAREA")
objTEXTAREA.name="BigTextArea"
objTEXTAREA.value=TempVar.substr(0,FormLimit)
document.theForm.appendChild(objTEXTAREA)
TempVar=TempVar.substr(FormLimit)
}
}
}
</SCRIPT>
ThereceivingActiveServerPage(ASP)pagereconstructsthevariable:
<%
DimBigTextArea
ForI=1ToRequest.Form("BigTextArea").Count
BigTextArea=BigTextArea&Request.Form("BigTextArea")(I)
Next
%>
100K的限定?微软居然来这一手!幸亏他们本人给出了几个办理计划,看一下上文能够晓得,微软供应了2种可行的办法:
第一种利用Request.BinaryRead(Request.TotalBytes),第二种利用分段上传的体例,基于少变动程序的准绳,我们接纳第二种体例。可是在利用的过程当中,icech偶然中发明,间接利用
ForI=1ToRequest.Form("BigTextArea").Count
BigTextArea=BigTextArea&Request.Form("BigTextArea")(I)
Next
来取代Request.Form("BigTextArea")居然也能到达一样的效果!惊异!我想大概体系每次将100K的内容发送给Request,上段程序又在举行轮回,因而到达了一样的效果。
以上是icech办理成绩的办法,如今旧事体系比方:乔客、动力、惠信对照好的体系也都存在这个成绩,人人能够试着用这类办法来办理。
上面再给人人供应一个我在CSDN上发明的一个帖子,和我写的殊途同归,办理了一样的成绩,办法也一样,供参考:
怎样在Form域中Post年夜于100K字节的数据????
之前在事情中碰到一个成绩,当表单发送的数据量很年夜时,就会报错。查阅MSDN懂得到,缘故原由是微软对用Request.Form()可吸收的最年夜数据限定为100K字节。
微软倡议用Request.BinaryRead()读取表双数据,但因为这类办法读出的是二进制数据,必要对读出的数据逐字节举行剖析,天生成心义的字符串(MSDN上的一段程序就是如许写的,但它并没有思索诸如标点标记等本义字符必要举行特别剖析)。假如说这类办法关于纯英文体系委曲可用的话,则关于中文体系来讲就有极年夜的贫苦,由于汉字是用两个字节暗示的,而读出的二进制数据自己其实不能判别是英文仍是汉字(不然就不是二进制数据,而是字符串了^-^)。如许的话就必需懂得汉字的编码纪律才干举行剖析。最初,即便算法上能把这些都剖析出来,人人想一想关于一个MB级的巨型字符串逐字节举行剖析,其效力何如?以是,此路欠亨!
不外,举措老是有的。一入手下手我觉得是全部表双数据的总和不克不及凌驾100KB,厥后发明这是对表单内每一个域的限定。成绩的办理举措是,关于一个必要发送年夜数据的域,在提交表单前将数据拆分为小于限额的数份,分离放在数个hidden域中,同时把原有域清空,再正式提交表单。服务器端仍是用Request.Form()读取各hidden域的数据,再依照按次把他们拼接起来就好了。次要代码以下:
注重:必要在Form中的HTML代码内指定一个DIV,以便向个中静态拔出hidden域。
====客户端示例代码====
<scriptlanguage=javascript>
//数据拆分,并放到响应的hidden域中,在Form的onSubmit事务中引发
functionfnPreHandle()
{
variCount;//拆分为几个域
varstrData;//原始数据
variMaxChars=50000;//思索到汉字为双字节,域的最年夜字符数限定为50K
variBottleNeck=2000000;//假如文章凌驾2M字,必要提醒用户
varstrHTML;
//原始数据
strData=frmTest.BigField.value;
//假如文章其实太长,必要提示用户
if(strData.length>iBottleNeck)
{
if(confirm("您要公布的文章太长,倡议您拆分为几部分分离公布。
假如您保持提交,注重必要较长工夫才干提交乐成。
是不是保持提交?")==false)
returnfalse;
}
iCount=parseInt(strData.length/iMaxChars)+1;
//hdnCount纪录原数据域拆分为几个子域
strHTML="<inputtype=hiddenname=hdnCountvalue="+iCount+">";
//天生各子域的HTML代码
for(vari=1;i<=iCount;i++)
{
strHTML=strHTML+"
"+"<inputtype=hiddenname=hdnBigField"+i+">";
}
//在Form中DIV(divHidden)内静态拔出各hidden域的HTML代码
document.all.divHidden.innerHTML=strHTML;
//给各子域赋值
for(vari=1;i<=iCount;i++)
{
frmTest.elements["hdnBigField"+i].value=strData.substring((i-1)*iMaxChars,i*iMaxChars);
}
//原数据域清空
frmTest.BigField.value="";
}
</script>
====服务器端示例代码====
<%
DimstrData
DimintFieldCount
Dimi
intFieldCount=Request.Form("hdnCount")
Fori=1TointFieldCount
strData=strData&Request.Form("hdnBigfield"&i)
Next
Response.WritestrData
%>
你说微软为何要有个100KB的限定呢?浑!由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; 虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。 交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。 学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点: 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名") Server:这个表示的服务器,操作服务器的一些东西使用这个,如Server.Mappath转换服务器路径,Server.CreateObject实例化一个组件 那么,ASP.Net有哪些改进呢?
页:
[1]