问题描述
我做了一个文件上传,利用AJAX实现进度条,在本地上没事,上传到服务器上就不行了,具体代码如下所示:load.aspx页面代码:<scripttype="text/javascript">functionajaxGet(){$.post("UpLoadHandler.ashx",{date:newDate()},function(data){varnum=parseInt(data);varobj,Mywidth,curwidth,divwidth;if((!isNaN(num))&&(num<100)){//$("#result").text(num+"%");$("#progress").show();divwidth=document.getElementById("divmain").offsetWidth;obj=document.getElementById("processbar");curwidth=num/100*580;Mywidth=obj.style.width;Mywidth=Mywidth.replace("px","");Mywidth=parseInt(Mywidth);Mywidth=curwidth;obj.style.width=Mywidth+"px";window.setTimeout(ajaxGet,10);}elseif((!isNaN(num))&&(num==100)){//alert(num);iosOverlay({text:"上传成功!",duration:2e3,icon:"Images/check.png"});//alert('上传成功!');//$("#result").text("100%");//window.setTimeout('$("#result").text("发送已完成");',1000);$("#progress").hide();}});}</script><body><formid="form1"runat="server"><asp:FileUploadID="file"runat="server"BorderStyle="None"CssClass="upfile"Width="160px"/><asp:LinkButtonID="btnOK"runat="server"CssClass="upbtn"OnClientClick="returnCheckWorkFile()"onclick="upload_linkbtn_Click"></asp:LinkButton></form></body>load.aspx.cs代码:protectedvoidupload_linkbtn_Click(objectsender,EventArgse){stringupPath=ConfigurationManager.AppSettings["UpPath"];stringUpPathSever=ConfigurationManager.AppSettings["UpPathSever"];if(!string.IsNullOrEmpty(upPath)){System.IO.DirectoryInfodir=newSystem.IO.DirectoryInfo(upPath);//判断文件夹否存在,不存在则创建if(!dir.Exists){dir.Create();}if(file.PostedFile!=null&&file.PostedFile.ContentLength!=0){Session["Schedule"]="0";//启动一个线程Threadth=newThread(newThreadStart(Upload));//注册客户端脚本ClientScript.RegisterStartupScript(this.GetType(),"ajaxGet","ajaxGet()",true);th.Start();}HttpFileCollectionfiles=HttpContext.Current.Request.Files;stringlocalFileName=System.IO.Path.GetFileName(files[0].FileName);stringsaveFilePath=upPath+localFileName;Int64nFileSize=file.PostedFile.ContentLength;//获取上传文件的大小stringReStr=UpPathSever+localFileName;file.SaveAs(saveFilePath);}一般处理文件LoadHandler.ashx.cs代码:publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="text/plain";StringtempStr=(context.Session["Schedule"]??"0").ToString();context.Response.Write(tempStr);}publicboolIsReusable{get{returnfalse;}}请各位大大帮忙看看这是为什么?
解决方案
解决方案二:
搜一搜:异步AJAXweb天生是多线程的,不要胡乱启动什么线程
解决方案三:
引用1楼Z65443344的回复:
搜一搜:异步AJAXweb天生是多线程的,不要胡乱启动什么线程
额,差点忘了//启动一个线程Threadth=newThread(newThreadStart(Upload));该线程是用来监听“Upload”这个方法的,Upload方法如下privatevoidUpload(){varpostfile=file.PostedFile;intlength=postfile.ContentLength;//stringpath=Server.MapPath("~/upLoadFile/");intUploadLength=0;intbufferSize=100000;byte[]buffer=newbyte[bufferSize];try{//stringpath=Server.MapPath("upLoadFile/");//stringfileName=Path.Combine(path,string.Format("{0}{1}",DateTime.Now.ToString("yyyyMMddhhmmss"),Path.GetExtension(postfile.FileName)));stringfileName=file.FileName;using(FileStreamfs=newFileStream(fileName,FileMode.Create)){while(UploadLength<length){intbytes=postfile.InputStream.Read(buffer,0,bufferSize);fs.Write(buffer,0,bytes);UploadLength+=bytes;Session["Schedule"]=(int)Math.Ceiling((double)UploadLength/(double)length*100);Thread.Sleep(100);}}Session["Schedule"]=100;}catch{throw;}}
解决方案四:
上传进度条有第三方控件,不需要AJAX自己实现而且即使要自己实现,也不要胡乱开什么线程你这是把web当单机玩吗
解决方案五:
现在我的疑问就是,在本地上测试一点问题也没有,为什么到服务器上就不行了,这是我代码的问题还是服务器获取IIS的问题
解决方案六:
所以说你是在把web当单机版在玩在本地测试,客户端和服务端都在同一台电脑上,IE和服务端的通信也都是内存共享的方式通信,不走网卡而且本地测试是单用户,没有多用户交互你要发布到IIS,就得按照通信的思想去做,而不是单机的思想
解决方案七:
额,那该怎么解决