ASP网页编程之xmlhttp 分块上传文件
结论:和PHP一样,ASP简单而易于维护,很适合小型网站应用,通过DCOM和MTS技术,ASP甚至还可以完成小规模的企业应用,但ASP的致命缺点就是不支持跨平台的系统,在大型项目开发和维护上非常困难。编写思绪:把当地文件在客户端经由过程base64编码今后发送目标地.测试过程当中,上传文件过年夜,招致超时不乐成.
厥后经由改良.把编码分段发送.测试20M乐成
编写目标:在传统的办理计划内里,一次一次拔取上传能够.可是在碰着把数据库里文件路径读出来,并把这些文件上传到一个中央的时分就对照贫苦.
假如失掉路径一个一个往找到用ftp固然也是能够的,但每次找这些文件我看城市对照费时。这里编写这个次要就是为了经由过程数据库里的文件路径获得文件.把文件一次批量上传到一个中央.
其次要目标仍是为了熬炼一下本人.
办理历程:后来试着用摹拟键盘输出强行赋值给file控件用传统的办法上传。但是老碰着空值的情形,以致有良多文件没有发送进来。查阅一些材料,如今是把一切路径经由过程数据库取到然后写到一个js里。然后在前台用js读取这些路径,经由过程xmlhttp来发送文件。
由于ie不太喜好xmlHttp.总以为他有歹意举动.以是老谈出提醒告诫.以是操纵的时分不克不及利用web路径.只能用物理路径往会见它.
然后服务端有一文件来吸收这些编码,并对其举行解码.以是我称之为"c/s".^_^
今朝良多代码还在完美中.
复杂先容一下:
aryFiles.push("c:aaa.zip");
aryFiles.push("c:bb.exe");
这里为文件路径和文件.可为多个
今后这个路径也能够经由过程file控件在客户端取到
http://www.xxx.com/xxx/xxx.asp
这个是目标地,能够改成本人想要的地点.
ado_stream.LoadFromFile(server.mappath(".")&"/"&+str_filename)
server.mappath(".")&"/"&+str_filename这里是读取文件.
server.mappath(".")&"/"&路径和寄存路径分歧
ado_stream.SaveToFileserver.mappath(".")&"/"&str_filename,2
server.mappath(".")&"/"&这个为寄存文件的路径.str_filename为文件名
这里读取和寄存都是放在程序所放目次中.人人测试的时分也能够坚持如许便可
把第一段代码放到当地(eg:c:upload.htm)
把第二段代码放到服务器上,能够是当地服务器,能够是公网服务器.和下面的目标地坚持分歧
(eg:http://www.xxx.com/upload.asporhttp://localhost/www/upload.asp)
操纵:找到第一段代码保留的中央。实行便可(eg:翻开c盘实行upload.htm)
今朝程序还在调试过程当中,但愿人人提出可贵定见
客户端代码<html><head></head><body><inputtype=buttonvalue="发送"/><inputtype=buttonvalue="中止"/><divid="ddd"width=300px></div><br></br><DIVid=div_message></DIV></body><scriptlanguage=VBScript>Functionbytes2BSTR(vIn)strReturn=""Fori=1ToLenB(vIn)ThisCharCode=AscB(MidB(vIn,i,1))IfThisCharCode<&H80ThenstrReturn=strReturn&Chr(ThisCharCode)ElseNextCharCode=AscB(MidB(vIn,i+1,1))strReturn=strReturn&Chr(CLng(ThisCharCode)*&H100+CInt(NextCharCode))i=i+1EndIfNextbytes2BSTR=strReturnEndFunction</script><scriptlanguage=javascript>varxmlhttp;varado_stream;varmFileName,mPartStart,mPartID,mPartEnd;varSendCount;varBlockSize;varBreaked;vararyFiles;BlockSize=1024*100;//每次发送字节数Breaked=false;aryFiles=newArray();//入手下手发送文件functionBeginSendFiles(){initAryFiles();SendFile(aryFiles.pop());}//机关待发送文件的数组functioninitAryFiles(){aryFiles.push("c:aaa.zip");aryFiles.push("c:bb.exe");//c:aaa.zipc:bb.exe当地文件aryFiles.reverse();//文件名}functionSendFile(vFullPath){//空文件则不实行上传if(!vFullPath){return;}Breaked=false;div_message.innerHTML="";ado_stream=newActiveXObject("ADODB.Stream");//读取文件的流ado_stream.Type=1;ado_stream.Open();ado_stream.LoadFromFile(vFullPath);//读取文件ado_stream.position=0;SendCount=Math.ceil(ado_stream.size/BlockSize);//假如不足数则多发送一次//alert(SendCount);varreg=/w+.w+$/gimFileName=reg.exec(vFullPath);mPartStart=true;mPartID=1;mPartEnd=false;SendData();}functionSendData(){if(SendCount>0){vardom=newActiveXObject("msxml2.DOMDocument");//发送的xml文件dom.async=false;dom.resolveExternals=false;//机关xml文件头varnode=dom.createProcessingInstruction("xml","version=1.0");dom.appendChild(node);node=null;//机关root节点varroot=dom.createElement("root");dom.appendChild(root);dom.documentElement.setAttribute("xmlns:dt","urn:schemas-microsoft-com:datatypes");//机关保留二进制数据的节点updatanode=dom.createElement("upData");node.dataType="bin.base64";//bin。base64编码varatt=dom.createAttribute("FileName");//文件名属性att.value=mFileName;node.setAttributeNode(att);att=null;varatt=dom.createAttribute("PartStart");//分段入手下手标志att.value=mPartStart;node.setAttributeNode(att);att=null;varatt=dom.createAttribute("PartID");//分段序号att.value=mPartID;node.setAttributeNode(att);att=null;varatt=dom.createAttribute("PartEnd");//分段停止标志att.value=mPartEnd;node.setAttributeNode(att);att=null;root.appendChild(node);node.nodeTypedValue=ado_stream.Read(BlockSize);//节点数据从stream读取,流动长度node=null;SendCount-=1;xmlhttp=newActiveXObject("Microsoft.XMLHTTP");xmlhttp.open("POST","http://www.xxx.com/xxx/xxx.asp",false);//http://www.xxx.com/xxx/xxx.asp为web路径上的文件xmlhttp.onreadystatechange=CallBack;xmlhttp.send(dom);mPartStart=false;xmlhttp=null;}else{ado_stream.Close();ado_stream=null;}}functionCallBack(){//上传乐成if(xmlhttp.readystate==4){//反省是不是中止上传if(Breaked){return;}if(SendCount>0){mPartID+=1;//div_message.innerHTML+=("<br>"+xmlhttp.ResponseText);varp=Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize)+1))*100);//盘算进度百分比ShowBar(p);vart=setTimeout("SendData();",1);}else{//传送完文件//div_message.innerHTML+=mFileName+"传送终了!<br>";//持续传下一文件ShowBar(0);varcFile=aryFiles.pop();SendFile(cFile);}}}functionShowBar(per){//进度条ddd.innerHTML="<tablewidth=200border=0cellpadding=0cellspacing=0><tr><tdbgcolor=#6699FF><inputtype=buttonstyle=width:"+per+"%;border:0px;background:#005599;color:#FFFFFFvalue="+per+"%></td></tr></table>";}</script></html>
服务端代码<%@LANGUAGE=VBScript%><%OptionExplicitResponse.Expires=0界说变量和工具。dimado_streamdimxml_domdimxml_datadimstr_filenamedimbol_PartStartdimint_PartIDdimbol_PartEnd创立Stream工具setado_stream=Server.CreateObject("ADODB.Stream")从Request工具创立XMLDOM工具setxml_dom=Server.CreateObject("MSXML2.DOMDocument")xml_dom.load(request)读出包括二进制数据的节点setxml_data=xml_dom.selectSingleNode("root/upData")str_filename=xml_data.getAttribute("FileName")bol_PartStart=CBool(xml_data.getAttribute("PartStart"))int_PartID=CInt(xml_data.getAttribute("PartID"))bol_PartEnd=CBool(xml_data.getAttribute("PartEnd"))翻开Stream工具,把数据存进个中ado_stream.Type=11=adTypeBinaryado_stream.openifnotbol_PartStartthenado_stream.LoadFromFile(server.mappath(".")&"/"&+str_filename)读取文件ado_stream.position=ado_stream.sizeendifado_stream.Writexml_data.nodeTypedValue文件存盘ado_stream.SaveToFileserver.mappath(".")&"/"&str_filename,2保留文件2=adSaveCreateOverWriteado_stream.close开释资本setado_stream=Nothingsetxml_dom=Nothing向扫瞄器前往信息Response.Write"Uploadsuccessful!"&str_filename&int_PartID&bol_PartStart%>
别的:此文的目标并非说这个程序能给伴侣们办理甚么成绩,次要目标仍是为了和人人交换一些心得:
碰着成绩->发明成绩->办理成绩.
但愿人人都不要成为一个尺度的代码呆板人。
多学、多看、多思索、多理论。
没有甚么是不克不及办理的。
asp,jsp,php是web开发的三大技术,asp简单易用且有microsoft做靠山,jsp功能强大是因为有java支持,php则开源跨平台.在国内,asp应用范围最广,jsp发展势头最猛,php则处于劣势.这可能与公司的支持以及技术的培训有关. 完全不知道到底自己学的是什么。最后,除了教程里面说的几个例子,还是什么都不会。 最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。 还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。 先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习 尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。
页:
[1]