仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 376|回复: 8
打印 上一主题 下一主题

[学习教程] ASP教程之进修ASP之办理年夜字段在Form中Post堕落的...

[复制链接]
若天明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况;
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-19 07:58:00 | 只看该作者
虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。
兰色精灵 该用户已被删除
板凳
发表于 2015-1-24 15:20:33 | 只看该作者
交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。
若相依 该用户已被删除
地板
发表于 2015-2-1 19:04:51 | 只看该作者
我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。
若天明 该用户已被删除
5#
 楼主| 发表于 2015-2-7 14:41:57 | 只看该作者
学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:
小女巫 该用户已被删除
6#
发表于 2015-2-22 11:00:20 | 只看该作者
我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标.
柔情似水 该用户已被删除
7#
发表于 2015-3-7 00:11:36 | 只看该作者
Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名")
简单生活 该用户已被删除
8#
发表于 2015-3-13 23:15:43 | 只看该作者
Server:这个表示的服务器,操作服务器的一些东西使用这个,如Server.Mappath转换服务器路径,Server.CreateObject实例化一个组件
admin 该用户已被删除
9#
发表于 2015-3-20 22:58:52 | 只看该作者
那么,ASP.Net有哪些改进呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 15:04

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表