读书人

Flash编写的文件上传在火狐下报IO异常

发布时间: 2013-07-04 11:45:40 作者: rapoo

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

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

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

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

有效办法加分到100 Flash?上传文件
[解决办法]
是存在这个问题

用plupload,这个也是flash,不存在这样问题。
[解决办法]
有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);
}

}
}

读书人网 >asp.net

热点推荐