在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])) {
    exit;
} else {
    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.Request;
                    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 = cookieValue;
            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.Request;
                    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 = cookieValue;
            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版本,只是是收费的,但相信,用的应该就是这种方法。

本文为原创,转载请保留出处:MitchellChu's Blog

$(function(){
    setTimeout(function(){
        $('#file_upload').uploadify({
            'swf'      : 'tools/uploadify/uploadify.swf',
            'uploader' : 'upload.php',
            'onUploadSuccess' : function(file, data, response) {
                 
            }
        });
    },10);
});
 
http://stackoverflow.com/questions/1729179/uploadify-session-and-authentication-with-asp-net-mvc
http://www.uploadify.com/documentation/uploadify/using-sessions-with-uploadify/
 
 

根据stackoverflow上的帖子,给js文件加上随机参数,欺骗chrome浏览器防止缓存,使每次都发起请求。

  • Asp.Net Web From

    <script src="/Resources/uploadify/jquery.uploadify3.1Fixed.js?ver=<%=(new Random()).Next(0, 99999).ToString() %>" type="text/javascript"></script>
  • Asp.Net MVC

    <script type="text/javascript" src=@Url.Content("~/Content/uploadify/jquery.uploadify3.1Fixed.js?ver=")@DateTime.Now.Ticks></script>
  • PHP

    <script src="js/jquery.uploadify.min.js?ver=<?php echo rand(0,9999);?>" type="text/javascript"></script>

(转)由Uploadify插件想到的Flash无法传递Session和Cookie的问题解决的更多相关文章

  1. sae storage 使用uploadify插件进行文件批量上传

    uploadify插件在文件上传方面还是很不错的,这不我需要往sae 的storage上上传文件,就用了它.下面我就分享一下如何实现的吧.我们先到官网下载最新的uploadify最新的插件包.在页面中 ...

  2. 关于ThinkPHP下使用Uploadify插件 仅有火狐提示HTTP Error (302)错误的解决办法

    'VAR_SESSION_ID' => 'session_id', //修复uploadify插件无法传递session_id的bug 首先在项目目录中的Common/Conf/config.p ...

  3. 解决uploadify插件不同浏览器下的兼容性问题

    http://www.thinkphp.cn/code/2138.html uploadify在部分浏览器上没法使用,或者各种报错的解决方法.uploadify插件上传图片是很爽的体验. 如果用chr ...

  4. uploadify插件Http Error(302)错误记录(MVC)

    由于项目(asp.net MVC)需要做一个附件上传的功能,使用的是jQuery的Uploadify插件的2.1.0版本,上传文件到自己项目指定的文件夹下面.做完之后,在谷歌上测试是正确的,在火狐上报 ...

  5. jQuery多图上传Uploadify插件使用及传参详解

    因为工作需要,这两天接触到了Uploadify插件,由于是第一次用,花了我近一天的时间.下面我把我在用这个插件过程详细的分享出来,也让自己巩固一下,也希望能帮助到你. 所需文件: jquery-1.8 ...

  6. uploadify插件实现多个图片上传并预览

    使用uploadify插件可方便实现图片上传功能.兼容ie6.ie7. 上传成功之后使用插件的回调函数读取json数据,根据url实现图片预览. 效果图: 点击浏览文件上传图片,图片依次在右侧显示预览 ...

  7. uploadify 3.2 java应用丢失session

    flash中有个bug就是自身创建一个session,这样就导致与web本身的session不一致 权限验证失败的问题.  原因: 因为uploadify是不会自动传送session值的,所以当ses ...

  8. c# asp.net mvc4 使用uploadify插件实现上传功能

    [1]首先去官网下载插件:http://www.uploadify.com/download/ .ww我使用的是免费的,基于flash的版本.因为基于H5的版本需付费使用,然后使用该插件也就是做做毕设 ...

  9. JQUery利用Uploadify插件实现文件异步上传(十一)

    一:简介: Uploadify是JQuery的一个上传插件,实现的效果非常好,带进度显示 ,且Ajax异步,能一次性上传多个文件,功能强大,使用简单 1.支持单文件或多文件上传,可控制并发上传的文件数 ...

随机推荐

  1. having 子句与where区别

    having 子句,条件子句 与 where 功能.用法相同,执行时机不同. where 在开始时执行检测数据,对原数据进行过滤. having 对筛选出的结果再次进行过滤. having 字段必须是 ...

  2. Elasticsearch安装和使用

    Elasticsearch安装和使用 Elasticsearch 是开源搜索平台的新成员,实时数据分析的神器,发展迅猛,基于 Lucene.RESTful.分布式.面向云计算设计.实时搜索.全文搜索. ...

  3. UI-程序的运行顺序

    在AppDelegate.m里面的每个方法里都输入(包括main文件里也输入) NSLog(@"%s %d”,__func__,__LINE__); __func__ :代表使用的方法 __ ...

  4. 【转】class卸载、热替换和Tomcat的热部署的分析

    这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理.一 class的热替换ClassLoader中重要的方法 loadClass ...

  5. 51nod1258 序列求和V4

    T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k,求S(n).   例如k = 2,n = 5,S(n) = 1^2 + 2^2 + 3^2 + 4^ ...

  6. 从官方下载 Bootstrap 版本 并写 第一个页面

    从官方下载  Bootstrap 版本 页面内容参考自 http://www.cnblogs.com/sanjuantianshu/p/3935120.html bootstrap-3.2.0.zip ...

  7. 黄聪:PHP json_encode中文乱码解决方法

    相信很多人在使用Ajax与后台php页面进行交互的时候都碰到过中文乱码的问题.JSON作为一种轻量级的数据交换格式,备受亲睐,但是用PHP作为后台交互,容易出现中文乱码的问题.JSON和js一样,对于 ...

  8. 黄聪:如何删除wordpress登录之后wp_footer、wp_head自行加载的Open Sans字体、fonts.googleapis.com连接导致卡死的问题

    有时候在浏览自己的WordPress网站时,发现网页长时间无响应, 卡在正在连接到fonts.googleapis.com ,如下图所示: 查看网页源码时,发现Head里面有如下一段代码: <l ...

  9. OAF_EO系列7 - OAException异常处理及实现(案例)

    2014-06-12 Created By BaoXinjian

  10. UVA 253 Cube painting(暴力打表)

    Cube painting Problem Description: We have a machine for painting cubes. It is supplied with three d ...