uploadify 火狐flash下上传不成功,错误提示没有session

1678人阅读
项目上线后,客户反映在火狐下上传文件失败,测了一下果真如此;debug了下一看每次进入权限过滤器时session都为空,然后在网上查了一大堆资料;
最后发现是falsh上传的问题sessionid变了,这个在uploadify官网有阐述;所以只要把sessionid传进回话机制里边就行;
$('#uploadify').uploadifySettings('script', &${basePath }/Attachment/doCreateAttachment.jsessionid=&%=session.getId() %&&);&
$('#uploadify').uploadifyUpload();
&%=session.getId() %&活用el表达式${pageContext.session.id}
务必是分号隔开,不是问号,问号就成request传参了!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:184921次
积分:2412
积分:2412
排名:第16097名
原创:19篇
转载:249篇
(2)(1)(6)(10)(3)(5)(4)(2)(1)(1)(1)(5)(8)(2)(1)(2)(5)(12)(13)(2)(2)(2)(1)(4)(2)(2)(4)(15)(10)(39)(8)(5)(2)(8)(6)(15)(30)(17)(4)(6)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'&&&&&&&&&&&&&
一、问题描述:
& & & & & & & 项目整体运行正常,但挂上网络后一个月,客户来电说,(非IE浏览器访问下)图片上传功能失效&&选择图片,点击上传按钮,进度条跑完了,但是预览图没有出现。
初步估计:1、图片预览功能出问题了; 2、上传功能出问题了;3、网络问题(上传图片,超时失败);4、操作出错;
问题排除:1、操作出错&&登录网站测试与本地测试问题一致,排除;
& & & & & & & & & 2、网络问题&&本地项目访问测试,问题依旧,排除;
& & & & & & & & & 3、图片预览功能出问题&&该方法没有使用插件,只是单纯的读取地址,链接显示图片,与问题不相关,排除;
& & & & & & & & & 4、上传功能出问题&&反复检查上传方法&
并仔细重新阅读插件文档,方法无错;后来加入onError事件,执行的时候onError事件被触发&&问题锁定在发请求的环节,经过多次调整,还是不得其法!
问题解决:最后请教同事师兄,问题得以解决&&因为有过类似的经验,他初步估计是程序拦截器的问题(我才想起,前不久应客户的要求,增加了session拦截的功能)&&因为uploadify是不会自动传送session值的,所以当session被拦截后,它的请求是发不出去的(补充,还有一种情况就是uploaddify是使用flash来处理文件文件上传,而在在非IE浏览器(Firefox,Chrome)下使用flash方式向服务器发起请求,是会新生成一个session的(此时旧的session则丢失了),如果要避免这个问题,需要把当前的sessionId作为形参传给servlet类);
解决方法:在请求方法后面加上;jsessionid=&%=session.getId()%&&&如
'uploadPictures.action?userId='+userId+','+folderId+&;jsessionid=&%=session.getId()%&',&
二、补充:uploadify上传时,只要一初始化就会发出一个请求,而这个请求是当前页面的地址,解决方法是:
将jquery.uploadify.min.js(我用的版本是3.2)原来的代码:
1 this.settings.upload_url = pleteURL(this.settings.upload_url);this.settings.button_image_url = pleteURL(this.settings.button_image_url)
1 this.settings.upload_url = pleteURL(this.settings.upload_url);this.settings.button_image_url = this.settings.button_image_url ? pleteURL(this.settings.button_image_url) : this.settings.button_image_url
阅读(...) 评论()由Uploadify插件想到的Flash无法传递Session和Cookie的问题解决
我的图书馆
由Uploadify插件想到的Flash无法传递Session和Cookie的问题解决
  在ASP.NET MVC3中使用Uploadify上传文件时发现,在后台需要验证登录状态的时候,Uploadify根本无法完成验证,因此,在后台只能使用非验证状态进行文件上传 —— 众所周知,这无异于给非登录的不安分子提供了一个绝佳的机会。
  为了解决这个问题,我们就需要去了解Uploadify,至少在我开始要解决这个问题的时候是这么想的.在Uploadify的找到了这么专门的一节:Using Sessions with Uploadify.
  这文章无疑对我们解决问题是个好的开端。也许你会问,客户端也有Session么?如果你是以服务器那种角度考虑,我可以非常肯定的告诉你,当然——没有! HTTP的请求是一个无状态请求,Session的一切存在都以客户端和服务端的交换标志而延续的。在大部分情况下,是在Cookies里面设置SessionId来达到此种目的。在客户端不支持Cookies的时候,可能会在URI中加入标志来达到同样的目的。至于更深入的讨论就不属于本文范围。这里做出说明,是想让我们的问题更能针对的解决,将问题缩小到:Uploadify如何将Cookies传递到服务端。
  在上面提及的文档中,官方给出了PHP的解决方案,代码非常简单:
/*PHP在客户端初始化Uploadify的代码*/
$('#file_upload).uploadify({
&&& // Your normal options here
&&& formData : { '&?php echo session_name();?&' : '&?php echo session_id();?&' }
/*PHP服务端的代码*/
$session_name = session_name();
if (!isset($_POST[$session_name])) {
&&& session_id($_POST[$session_name]); // 将当前的SessionId设置成客户端传递回来的SessionId
&&& session_start();&
  从代码可以看出,官方处理的具体思路是这样的:1. 加载含有Uploadify的页面时,将Cookies中的SessionId写入到Uploadify中的formData中;2. 在客户端提交的时候,SessionId会被当作表单数据被Uploadify一并提交到服务端;3. 在服务端检测,将提交上来的SessionId提取出来,并将当前状态以提交的SessionId为蓝本进行操作。这样,就能对操作进行验证,达到控制的目的。
  有了这个蓝本,在ASP.NET MVC3中解决起来也就不难了,按着官方的思路来即可:
1. 首先,将当前的状态存入formData中:
/*视图中的代码,使用Razor语法.*/
$("#fileupload").uploadify({
&&&&&&&&'formData' : {&@foreach(string k in Request.Cookies.AllKeys){
&&&&&&&&&&&&&&& @:'cookie_@(k)' : '@Request.Cookies[k].Value',
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& '' : ''}
&&&&&&&&})
为了完全模拟客户端状态,我们将所有的Cookies都放在了formData中,并且,为了以示区分,我们将键值名称统一用cookie_开头。
2. 客户端处理安全之后,我们就需要处理服务端了,在MVC中,我们没有PHP那种Session_id(Id)这种现成方法可以用(如果你有,请告诉我~),我们需要在Global.asax中设置,代码如下:
&&&&&&& protected void Application_BeginRequest(object sender, EventArgs e)
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& HttpRequest request = HttpContext.Current.R
&&&&&&&&&&&&&&&&&&& foreach (string k in request.Form.Keys)
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& if (k.IndexOf("cookie_") &= 0)
&&&&&&&&&&&&&&&&&&&&&&&&&&& AppendingCookies(k.Remove(0, 7), request.Form[k], request);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& catch { }
&&&&&&& private void AppendingCookies(string cookieName, string cookieValue, HttpRequest request)
&&&&&&&&&&& HttpCookie hc = request.Cookies.Get(cookieName);
&&&&&&&&&&& if(null == hc)
&&&&&&&&&&&&&&& hc = new HttpCookie(cookieName);
&&&&&&&&&&& hc.Value = cookieV
&&&&&&&&&&& request.Cookies.Set(hc);
我们在开始请求的时候,将请求拦截,并检查请求中提交上来的表单数据,如果发现有以"cookie_"开头的数据,就将此数据提取出来,设置到当前请求的Cookies中。
恩,事情到这里,显得就很完美了,Uploadify用起来已经和普通的请求没有任何差别了。但有一个小小的缺憾,就是每次请求,无论请求那一个数据,都会进行这么一遍操作,万一要是其他表单中真有这么一个"cookie_"开头的数据,那还真就不太好了,为了解决这个问题,我们需要对操作进行一点点改进,改进后代码如下:
&&&&&&& protected void Application_BeginRequest(object sender, EventArgs e)
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& RouteData rd = RouteTable.Routes.GetRouteData((HttpContextBase)new HttpContextWrapper(HttpContext.Current));
&&&&&&&&&&&&&&& string c = rd.GetRequiredString("controller");
&&&&&&&&&&&&&&& string a = rd.GetRequiredString("action");
&&&&&&&&&&&&&&& if (c.ToLower() == "uploadfile" && a.ToLower() == "upload")
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& HttpRequest request = HttpContext.Current.R
&&&&&&&&&&&&&&&&&&& foreach (string k in request.Form.Keys)
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& if (k.IndexOf("cookie_") &= 0)
&&&&&&&&&&&&&&&&&&&&&&&&&&& AppendingCookies(k.Remove(0, 7), request.Form[k], request);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& catch { }
&&&&&&& private void AppendingCookies(string cookieName, string cookieValue, HttpRequest request)
&&&&&&&&&&& HttpCookie hc = request.Cookies.Get(cookieName);
&&&&&&&&&&& if(null == hc)
&&&&&&&&&&&&&&& hc = new HttpCookie(cookieName);
&&&&&&&&&&& hc.Value = cookieV
&&&&&&&&&&& request.Cookies.Set(hc);
这里uploadfile是MVC中的控制器,upload是Action,我们在操作之前,检视一下当前的请求是否是文件上传,如果是,我们再来执行这些操作,这样,出现问题的可能性就降低了。
  写到这里,我们就已经完全解决Uploadify的状态问题了,甚至比官方处理的还要好些,既然这样,那就先告一段落。我们文章开始说过,这个不是Uploadify独有的问题,而是Flash的问题,因此,在使用Flash和系统做交互时,该如何处理呢?其实在解决我们文件上传验证的问题的时候,我们已经了解了处理此类问题的方法,我们完全可以参照Uploadify的处理方法来完成操作即可:
1. 将服务端的当前请求状态悉数放入到客户段准备和Flash交互的代码中(可以是JS,可以是HTML);
2. 客户端通过Flash将已经存放到客户端的请求状态封装到Flash的请求中,一并提交到服务端;
3. 服务端将Flash的请求中的Cookies信息提取出来,并设置到当前请求的Cookies中。
另外一种方法是,将Flash中的数据导出来,使用Js来进行提交,这种方式只需要将Flash中交互数据提取出来,JS的请求会自动将客户端的Cookies传递到服务端,这种方法相对来说更加简单高效。Uploadify也提供了HTML5版本,只是是收费的,但相信,用的应该就是这种方法。
本文为原创,转载请保留出处:
TA的最新馆藏[转]&
喜欢该文的人也喜欢uploadify上传文件火狐浏览器下丢失session - ITeye问答
uploadify上传文件火狐浏览器下丢失session
查了很多资料都不好用
采纳的答案
,把seesionid传过去试试。
uploadify的session是独立的,就是说和你页面的session不是同一个。
传JSESSIONID试试!
只能把session 传过去。当参数传过去
已解决问题
未解决问题}

我要回帖

更多关于 uploadify火狐io异常 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信