jQueryuploadify在谷歌和火狐浏览器下无法上传
原因:
由于jQuery uploadify是借助Flash来实现上传的,每一次向后台发送数据流请求时,ie会自动把本地cookie存储捆绑在一起发送给服务器。但Firefox、Chrome不会这样做,他们会认为这样不安全。哈,这就是原因。——摘自http://www.cnblogs.com/mbailing/archive/2011/03/30/uploadify.html
我是这样解决的,这样所有上传文件的代码都不需要修改,改动量最小,但是有安全隐患:
if(this.LoginInfo ==null)
{//解决uploadify兼容火狐谷歌浏览器上传问题//但是,此代码使系统有安全隐患,Flash程序请求该系统不需要验证//要解决此安全隐患,需要Flash程序传用户名和密码过来验证,但是该用户名和密码不能写在前端以便被不法用户看到if(Request.UserAgent =="Shockwave Flash")
{return;
}else{
filterContext.Result= RedirectToAction("LoginAgain","Account",new{ Area ="Auth"});return;
}
}
View Code
我们的系统是asp.netMVC的,虽说通过加密的方式可以让用户看不到敏感信息,但恶意用户不需要把敏感信息解密出来就可绕过系统验证。
验证信息不能直接写前台,可以用Ajax从后台获取验证信息,然后传给flash,然后在拦截器中验证。
修改后:
JS代码:
ajax请求后台获取用户名,传给flash
$(function() {
$.ajax({
url:"/Auth/Account/GetUserNamePwd",
type:"POST",
dataType:"json",
data: {},
success:function(data) {
$("#uploadify").uploadify({
height:25,
width:100,
swf:'/Content/Plugins/UploadifyJs/uploadify.swf',
uploader:'UploadFile',
formData: {
userName: data.data.userName,//ajax获取的用户名pwd: data.data.pwd//ajax获取的密码},
buttonText:'选择文件上传',
fileSizeLimit:'4MB',
fileTypeDesc:'文件',
fileTypeExts:'*.*',
queueID:'fileQueue',
multi:true,
onUploadSuccess:function(fileObj, data, response) {vard = eval("(" + data + ")");
$(".uploadify-queue-item").find(".data").html(" 上传完成");
$("#url").val(d.url);
$("#name").val(d.name);
},
onUploadError:function(event, ID, fileObj, errorObj) {if(event.size > 4 * 1024 * 1024) {
alert('超过文件上传大小限制(4M)!');return;
}
alert('上传失败');
}
});//end uploadify}
});
});//end $
View Code
拦截器中代码:
......if(this.LoginInfo ==null)
{//解决uploadify兼容火狐谷歌浏览器上传问题//但是,此代码使系统有安全隐患,Flash程序请求该系统不需要验证//要解决此安全隐患,需要Flash程序传用户名和密码过来验证,但是该用户名和密码不能写在前端以便被不法用户看到if(Request.UserAgent =="Shockwave Flash")
{stringuserName = Request.Params["userName"];stringpwd = Request.Params["pwd"];if(!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(pwd))
{
AuthDAL authDAL=newAuthDAL();
sys_user user=authDAL.GetUserInfoByName(userName);if(user !=null&& user.passWord==pwd)
{return;
}
}
}else{
filterContext.Result= RedirectToAction("LoginAgain","Account",new{ Area ="Auth"});return;
}
}
......
View Code