• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

Flash编写的文件上传在火狐下报IO错误

Sean918 2013-06-06 09:36:50
RT

在IE下可以用,在其他浏览器下就是提交不了。

查了很多资料,说Flash通过FileReference上传文件时,始终会取IE的cookie还是sessionid,导致服务端认为不是同一个连接,所以上传地址找不到。

有人知道解决办法吗?最好是C#版的解决方法。

有效办法加分到100
...全文
198 点赞 收藏 15
写回复
15 条回复
zhao8848jun 2014年01月22日
在哪个地方换?
引用 14 楼 wxy_xiaoyu 的回复:
搞定了 ! MVC 中只要把 FormsAuthentication.FormsCookieName 换成.ASPXAUTH 就可以了!! 多谢
回复 点赞
Sean918 2013年06月09日
搞定了 ! MVC 中只要把 FormsAuthentication.FormsCookieName 换成.ASPXAUTH 就可以了!! 多谢
回复 点赞
Sean918 2013年06月09日
刚刚用 firebug 看了一下 在第一次访问的时候 ASP.NET_SessionId 已经产生了一个sessionid 然后没有 ASPSESSID ,但是多了个 .ASPXAUTH 的cookie 不知道什么作用 再查查看
回复 点赞
Sean918 2013年06月09日
hi , 我知道 ASPSESSID 、 ASP.NET_SessionId 在普通的WebForm中有特殊作用。 但是我现在用的MVC里面好像机制不大一样,上面的这个代码在执行完毕后仍然无法路由到我指定访问的Action中去。 唉 还是学的不精的问题
回复 点赞
何小宝 2013年06月09日
- - MVC了解不多 处理机制不知道和Webform是否一样。 你明白cookie和session的关系么?还有你是否懂了 上面服务端这段代码的意思? 目前我的产品中 就是这么处理的。这也是目前为止唯一的解决方案。
回复 点赞
Sean918 2013年06月09日
首先 谢谢楼上的细致回答 但是,上面的这些代码我都看到过了,也尝试过了。 我现在是在ASP.NET MVC4的环境中做这个事情。 我现在的做法是,在访问页面的时候,将sessionid传到页面中,拼接到flash访问的url地址后,当作一个querystring来传递到服务端。 在服务端的Global.asax.cs文件的Application_BeginRequest事件中能得到上传的这个值。 然后问题就来了。 我不明白上面的这个代码,仅仅是修改了一下cookie的值,与session根本就没关系。 我尝试了一下上面的代码,cookie的值是被修改了,但是执行完了Application_BeginRequest事件后,代码根本无法路由到我指定的Action中去。 然后我又尝试修改session的值,但是在Application_BeginRequest事件中,无法访问session。 可是flash提交内容,根本就不触发 Session_Start 事件。 下面该怎么办?
回复 点赞
何小宝 2013年06月09日
你需要了解一下IHttpModule 它和全局应用程序有着相同的事件 只不过 全局应用程序 有点浪费资源 每个页面都要经过它
回复 点赞
何小宝 2013年06月09日
有2个插件曾经研究过. 一个是Uploadify一个是SWFUpload. Flash有一个共同的弊端就是所谓的Session丢失 其实不是丢失了 只是产生了不同的Seesion 那么你要做的时候 记录客户端Session值 上传的时候利用Url传参或者其他方式 将这个Seesion一起传递到服务器 验证是否一致。 参考代码. 注意看其中的一个参数ScriptData

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <link href="/Uploadify/uploadify.css" rel="stylesheet" type="text/css" />

    <script src="/Uploadify/jquery-1.4.2.min.js" type="text/javascript"></script>

    <script src="/Uploadify/jquery.uploadify.v2.1.4.min.js" type="text/javascript"></script>

    <script src="/Uploadify/swfobject.js" type="text/javascript"></script>

    <script type="text/javascript">
        var auth = "<% = Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>";
        var ASPSESSID = "<%= Session.SessionID %>";
        alert(ASPSESSID);
        
        $(document).ready(function () {
                $('#uploadify').uploadify({
                    'uploader': '/uploadify/uploadify.swf',
                    'script': '/Uploadify.ashx',
                    'cancelImg': '/uploadify/cancel.png',
                    'folder': '/uploads',
                    'auto': false,
                    'buttonText': '', 
                    'buttonImg':'/Uploadify/browse.jpg',
                    'scriptData': { 'ASPSESSID': ASPSESSID, 'AUTHID': auth },
                    'onSelect': function (e, data) {
//                        $('#uploadify').uploadifySettings('scriptData', { 'ASPSESSID': ASPSESSID, 'AUTHID': auth });
                    },       
                    'onComplete' : function(event,queueID,file,serverData,data){ 
			            //serverData为服务器端返回的字符串值
			            alert(serverData);
		             }
                });
            });
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div id="fileQueue">
    </div>
    <input type="file" name="uploadify" id="uploadify" />
    <p>
        <a href="javascript:$('#uploadify').uploadifyUpload()">上传</a>| <a href="javascript:$('#uploadify').uploadifyClearQueue()">
            取消上传</a>
    </p>
    </form>
</body>
</html>

服务端这么处理


using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace UploadifyDemo
{
    public class SessionModule : IHttpModule
    {
        //   销毁不再被HttpModule使用的资源
        public void Dispose()
        {
        }

        // 初始化一个Module,为捕获HttpRequest做准备
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        public void context_BeginRequest(object sender, EventArgs e)
        {
            string session_param_name = "ASPSESSID";
            string session_cookie_name = "ASP.NET_SessionId";
            string auth_param_name = "AUTHID";
            string auth_cookie_name = FormsAuthentication.FormsCookieName;

            HttpContext context = HttpContext.Current;

            if (context.Request.Form[session_param_name] != null)
            {
                UpdateCookie(session_cookie_name, context.Request.Form[session_param_name]);
            }
            else if (HttpContext.Current.Request.QueryString[session_param_name] != null)
            {
                UpdateCookie(session_cookie_name, context.Request.QueryString[session_param_name]);
            }
            else if (context.Request.Form[auth_param_name] != null)
            {
                UpdateCookie(auth_cookie_name, context.Request.Form[auth_param_name]);
            }
            else if (context.Request.QueryString[auth_param_name] != null)
            {
                UpdateCookie(auth_cookie_name, context.Request.QueryString[auth_param_name]);
            }
        }

        public 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);
        }

    }
}
回复 点赞
何小宝 2013年06月09日
首先你的贴出你的上传代码 你有没有让Flash和JS交互? 不知道你是怎么实现上传的。没法回答你
回复 点赞
Sean918 2013年06月08日
能详细说说吗 ? 谢谢
回复 点赞
何小宝 2013年06月08日
给你一个提示 在HttpModule中的事件中处理一下或者全局应用程序。 在客户端获取SAEESID 上传的时候作为参数带过去 再验证是否一致。
回复 点赞
Sean918 2013年06月08日
我晕 我找了plupload 的例子 ,也出现了 #2038 的错误 跟flash 一样
回复 点赞
wrost 2013年06月07日
是存在这个问题 用plupload,这个也是flash,不存在这样问题。
回复 点赞
Sean918 2013年06月07日
求高人帮忙啊
回复 点赞
Sean918 2013年06月07日
没人知道吗 ??
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告