首页 > 编程 > .NET > 正文

解决uploadify使用时session发生丢失问题的方法

2024-07-10 13:30:33
字体:
来源:转载
供稿:网友
这篇文章主要为大家详细介绍了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中的代码:

protected void Application_BeginRequest(object sender, EventArgs e)     {       /* we guess at this point session is not already retrieved by application so we recreate cookie with the session id... */       try       {         string session_param_name = "ASPSESSID";         string session_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]);         }         else if (HttpContext.Current.Request.QueryString[session_param_name] != null)         {           UpdateCookie(session_cookie_name, HttpContext.Current.Request.QueryString[session_param_name]);         }       }       catch       {       }        try       {         string auth_param_name = "AUTHID";         string auth_cookie_name = FormsAuthentication.FormsCookieName;          if (HttpContext.Current.Request.Form[auth_param_name] != null)         {           UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]);         }         else if (HttpContext.Current.Request.QueryString[auth_param_name] != null)         {           UpdateCookie(auth_cookie_name, HttpContext.Current.Request.QueryString[auth_param_name]);         }        }       catch       {       }     }      private void UpdateCookie(string cookie_name, string cookie_value)     {       HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);       if (null == cookie)       {         cookie = new HttpCookie(cookie_name);       }       cookie.Value = cookie_value;       HttpContext.Current.Request.Cookies.Set(cookie);     } 

在JS加载前面定义下面两个变量

var auth = "<% = Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>";  var ASPSESSID = "<%= Session.SessionID %>"; 

Handler文件代码如下:  

 public class BigFileUpLoadHandler : IHttpHandler, IRequiresSessionState   {     DALFile Fdal = new DALFile();     public void ProcessRequest(HttpContext context)     {       context.Response.ContentType = "text/plain";       VideoUpLoad(context, CLSOFT.Web.LZKS.Edu.Globe.filename);     }     public void VideoUpLoad(HttpContext context, string fileFolderName)     {       context.Response.Charset = "utf-8";       string aaaaaaa=context.Request.QueryString["sessionid"];       HttpPostedFile file = context.Request.Files["Filedata"];       string uploadPath = HttpContext.Current.Server.MapPath(UploadFileCommon.CreateDir(fileFolderName));       if (file != null)       {         if (!Directory.Exists(uploadPath))         {           Directory.CreateDirectory(uploadPath);         }         Model.ModelFile model = new Model.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 = new List<Model.ModelFile>();         }         else         {           list = context.Session["File"] as List<Model.ModelFile>;         }         list.Add(model);         context.Session.Add("File", list);       }       else       {         context.Response.Write("0");       }      } 

这段代码的功能是将多文件的信息存到context.Session["File"] as List<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':'Choose File',         '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) {            var value = response;            if(value==1){            Ext.Msg.alert("提示","上传成功");            }            else if(value==0){            Ext.Msg.alert("提示","请选择上传文件");            }            else if(value==-1){             Ext.Msg.alert("提示","已存在该文件");            }                      }       });     <%-- jQuery装载函数结束--%> 

动态的传递参数,并判断是否合法

//动态加载   function loadFileType(){   //检测   var medianame=Ext.getCmp("eName").getValue();   if(medianame.trim()==""){     Ext.Msg.alert("提示","媒体名称不能为空");     return;   }   var filetype=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值。  
后台处理程序:

public class FileUploadHelper : IRequiresSessionState, IHttpHandler {    int nCurrentUserID = -1;   public void ProcessRequest(HttpContext context)   {     try     {       nCurrentUserID = WebUtil.GetCurrentUserID();//该处的session值得不到     }     catch (Exception)     {     }     context.Response.ContentType = "text/plain";     context.Response.Charset = "utf-8";      string strFilename = string.Empty;     int nFiletype = 0;     float fFilelength = 0;     string strFileExt = string.Empty;     string strFilePath = 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)//获得文件长度(动态参数)     {       int nEmptFileLength = Convert.ToInt32(context.Request["length"].ToString());       fFilelength = (float)nEmptFileLength / 1024;     }     if (context.Request["Filename"] != null)//获得文件名(系统自带)     {       string filename = context.Request["Filename"].ToString();       strFileExt = Path.GetExtension(filename).ToLower();//获得后缀名     }     HttpPostedFile file = context.Request.Files["Filedata"];     string uploadPath = HttpContext.Current.Server.MapPath(@context.Request["folder"]);     //根据当前日期创建一个文件夹     string dirName = System.DateTime.Now.ToString("yyyyMMdd");     uploadPath += dirName;      string tmpRootDir = 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))       {         //写数据库成功保存文件         Media model = new Media();         int newMediaID = -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丢失问题,谢谢大家的阅读。



注:相关教程知识阅读请移步到ASP.NET教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表