解决uploadify使用时session发生丢失问题的方法
今天在使用uploadify时发现session会发生丢失的情况,经过一番研究发现,其丢失并不是真正的丢失,而是在使用Flash上传控件的时候使用的session机制和asp.net中的不相同。为解决这个问题使用两种方案,下面进行介绍
第一种:修改Gobal
前台aspx页面:
$("#uploadify").uploadify({ 'uploader':'/LZKS/Handler/BigFileUpLoadHandler.ashx', 'swf':'/LZKS/Scripts/uploadify/uploadify.swf', 'cancelImage':'/LZKS/Scripts/uploadify/cancel.png', 'queueID':'fileQueue', //'auto':false, 'multi':true, 'buttonText':'文件上传', 'formData':{'ASPSESSID':ASPSESSID,'AUTHID':auth}, 'onSelect':function(file){ $('#uploadify').uploadifySettings('formData',{'ASPSESSID':ASPSESSID,'AUTHID':auth}); alert(formDate); }, 'onComplete':function(file,data,response){ }, 'onQueueComplete':function(){ alert("上传完成!"); $('#fileQueue').attr('style','visibility:hidden'); }, 'onSelectError':function(file,errorCode,errorMsg){ $('#fileQueue').attr('style','visibility:hidden'); }, 'onUploadStart':function(file){ $('#fileQueue').attr('style','top:200px;left:400px;width:400px;height:400px;visibility:visible'); } }); });
接着修改Gobal中的代码:
protectedvoidApplication_BeginRequest(objectsender,EventArgse) { /*weguessatthispointsessionisnotalreadyretrievedbyapplicationsowerecreatecookiewiththesessionid...*/ try { stringsession_param_name="ASPSESSID"; stringsession_cookie_name="ASP.NET_SessionId"; if(HttpContext.Current.Request.Form[session_param_name]!=null) { UpdateCookie(session_cookie_name,HttpContext.Current.Request.Form[session_param_name]); } elseif(HttpContext.Current.Request.QueryString[session_param_name]!=null) { UpdateCookie(session_cookie_name,HttpContext.Current.Request.QueryString[session_param_name]); } } catch { } try { stringauth_param_name="AUTHID"; stringauth_cookie_name=FormsAuthentication.FormsCookieName; if(HttpContext.Current.Request.Form[auth_param_name]!=null) { UpdateCookie(auth_cookie_name,HttpContext.Current.Request.Form[auth_param_name]); } elseif(HttpContext.Current.Request.QueryString[auth_param_name]!=null) { UpdateCookie(auth_cookie_name,HttpContext.Current.Request.QueryString[auth_param_name]); } } catch { } } privatevoidUpdateCookie(stringcookie_name,stringcookie_value) { HttpCookiecookie=HttpContext.Current.Request.Cookies.Get(cookie_name); if(null==cookie) { cookie=newHttpCookie(cookie_name); } cookie.Value=cookie_value; HttpContext.Current.Request.Cookies.Set(cookie); }
在JS加载前面定义下面两个变量
varauth="<%=Request.Cookies[FormsAuthentication.FormsCookieName]==null?string.Empty:Request.Cookies[FormsAuthentication.FormsCookieName].Value%>"; varASPSESSID="<%=Session.SessionID%>";
Handler文件代码如下:
publicclassBigFileUpLoadHandler:IHttpHandler,IRequiresSessionState { DALFileFdal=newDALFile(); publicvoidProcessRequest(HttpContextcontext) { context.Response.ContentType="text/plain"; VideoUpLoad(context,CLSOFT.Web.LZKS.Edu.Globe.filename); } publicvoidVideoUpLoad(HttpContextcontext,stringfileFolderName) { context.Response.Charset="utf-8"; stringaaaaaaa=context.Request.QueryString["sessionid"]; HttpPostedFilefile=context.Request.Files["Filedata"]; stringuploadPath=HttpContext.Current.Server.MapPath(UploadFileCommon.CreateDir(fileFolderName)); if(file!=null) { if(!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } Model.ModelFilemodel=newModel.ModelFile(); model.File_ID=Guid.NewGuid().ToString(); model.File_Name=file.FileName; model.File_Path=UploadFileCommon.CreateDir(fileFolderName); model.File_Size=file.ContentLength; model.File_Extension=file.FileName.Substring(file.FileName.LastIndexOf('.')+1); model.File_Date=DateTime.Now; model.File_CurrentMan=CLSOFT.Web.LZKS.Edu.Globe.name; file.SaveAs(uploadPath+model.File_Name); List<Model.ModelFile>list=null; if(context.Session["File"]==null) { list=newList<Model.ModelFile>(); } else { list=context.Session["File"]asList<Model.ModelFile>; } list.Add(model); context.Session.Add("File",list); } else { context.Response.Write("0"); } }
这段代码的功能是将多文件的信息存到context.Session["File"]asList<Model.ModelFileModel.ModelFile>为文件信息类 实现批量上传的信息给Session
第二种方案:直接向后台传递session值
Ext.onReady(function(){ Ext.QuickTips.init(); <%--JQuery装载函数--%> $("#uploadify").uploadify({ 'uploader':'../Uploadify-v2.1.4/uploadify.swf',//上传swf相对路径 'script':'../Service/FileUploadHelper.ashx',//后台上传处理呈现 'cancelImg':'../Uploadify-v2.1.4/cancel.png',//取消上传按钮相对路径 'checkExisting':true,//服务端重复文件检测 'folder':'../UploadFile/',//上传目录 'fileExt':'*.jpg;*.png;*.gif;*.bmp',//允许上传的文件格式 'fileDesc':'jpg、png、gif、bmp',//文件选择时显示的提示 'queueID':'fileQueue',//上传容器 'auto':false, 'multi':false,//只允许单文件上传 'buttonText':'ChooseFile', 'scriptData':{'name':'','type':'','length':''},//在加载时此处是null //'onInit':function(){alert("1");},//初始化工作,在Extjs的嵌套中最先触发的函数 //选择一个文件后触发 'onSelect':function(event,queueID,fileObj){ //alert("唯一标识:"+queueID+"\r\n"+ //"文件名:"+fileObj.name+"\r\n"+ //"文件大小:"+fileObj.size+"\r\n"+ //"创建时间:"+fileObj.creationDate+"\r\n"+ //"最后修改时间:"+fileObj.modificationDate+"\r\n"+ //"文件类型:"+fileObj.type); $("#uploadify").uploadifySettings("scriptData",{"length":fileObj.size});//动态更新配(执行此处时可获得值) }, //上传单个文件接收后触发 'onComplete':function(event,queueID,fileObj,response,data){ varvalue=response; if(value==1){ Ext.Msg.alert("提示","上传成功"); } elseif(value==0){ Ext.Msg.alert("提示","请选择上传文件"); } elseif(value==-1){ Ext.Msg.alert("提示","已存在该文件"); } } }); <%--jQuery装载函数结束--%>
动态的传递参数,并判断是否合法
//动态加载 functionloadFileType(){ //检测 varmedianame=Ext.getCmp("eName").getValue(); if(medianame.trim()==""){ Ext.Msg.alert("提示","媒体名称不能为空"); return; } varfiletype=Ext.getCmp("eType").getValue(); if(filetype==""||filetype<0){ Ext.Msg.alert("提示","请选择媒体类型"); return; } //动态更新配(执行此处时可获得值) $("#uploadify").uploadifySettings("scriptData",{"name":medianame,"type":filetype,"sessionuserid":<%=session_userid%>}); //上传开始 $('#uploadify').uploadifyUpload(); }
<%=session_userid%>是取后台的一个变量,该变量在加载页面的时候获得了session值。当然也可以在前台直接获得session值。
后台处理程序:
publicclassFileUploadHelper:IRequiresSessionState,IHttpHandler { intnCurrentUserID=-1; publicvoidProcessRequest(HttpContextcontext) { try { nCurrentUserID=WebUtil.GetCurrentUserID();//该处的session值得不到 } catch(Exception) { } context.Response.ContentType="text/plain"; context.Response.Charset="utf-8"; stringstrFilename=string.Empty; intnFiletype=0; floatfFilelength=0; stringstrFileExt=string.Empty; stringstrFilePath=string.Empty; if(context.Request["sessionuserid"]!=null) { nCurrentUserID=Convert.ToInt32(context.Request["sessionuserid"].ToString()); } if(context.Request["name"]!=null)//获得文件名(动态参数) { strFilename=context.Request["name"].ToString(); } if(context.Request["type"]!=null)//获得文件类型(动态参数) { nFiletype=Convert.ToInt32(context.Request["type"].ToString()); } if(context.Request["length"]!=null)//获得文件长度(动态参数) { intnEmptFileLength=Convert.ToInt32(context.Request["length"].ToString()); fFilelength=(float)nEmptFileLength/1024; } if(context.Request["Filename"]!=null)//获得文件名(系统自带) { stringfilename=context.Request["Filename"].ToString(); strFileExt=Path.GetExtension(filename).ToLower();//获得后缀名 } HttpPostedFilefile=context.Request.Files["Filedata"]; stringuploadPath=HttpContext.Current.Server.MapPath(@context.Request["folder"]); //根据当前日期创建一个文件夹 stringdirName=System.DateTime.Now.ToString("yyyyMMdd"); uploadPath+=dirName; stringtmpRootDir=context.Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根目录 if(file!=null) { //判断目录是否存在 if(!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } //判断文件是否存在 strFilePath=uploadPath+"\\"+strFilename+strFileExt; if(!File.Exists(strFilePath)) { //写数据库成功保存文件 Mediamodel=newMedia(); intnewMediaID=-1; model.media_type=nFiletype; model.media_name=strFilename+strFileExt; model.file_path=strFilePath.Replace(tmpRootDir,"");//保存相对目录 model.file_length=fFilelength; newMediaID=MediaBLL.AddMadia(model,nCurrentUserID); if(newMediaID>-1)//数据库写入成功 { //保存文件 file.SaveAs(strFilePath); //下面这句代码缺少的话,上传成功后上传队列的显示不会自动消失 context.Response.Write("1"); } } else { context.Response.Write("-1"); } } else { context.Response.Write("0"); } }
这样就可以解决该问题了。
希望这两种方法都能帮助大家顺利解决session丢失问题,谢谢大家的阅读。