基于Jquery插件实现跨域异步上传文件功能


Posted in Javascript onApril 26, 2016

先说明白

这个跨域异步上传功能我们借助了Jquery.form插件,它在异步表单方面很有成效,而跨域我们会在HTTP响应头上添加access-control-allow-method,当然这个头标记只有IE10,火狐和谷歌上支持,对于IE10以下的浏览器来说,我们就不能用这种方式了,我们需要换个思路去干这事,让服务端去重写向我们的客户端,由客户端(与文件上传页面在同域下)来返回相关数据即可。

再做事

1 Jquery.form的使用

<form method="post" action="http://127.0.0.1:801/Home/UploadResult" enctype="multipart/form-data" id="form1">
 <input name="qdctvfile" id="qdctvfile11" type="file" onchange="eventStart()">
</form>
<script type="text/javascript">
 $("#form1").ajaxForm({
  beforeSerialize: function () {
   var filepath = $("#qdctvfile11").val()
   var extStart = filepath.lastIndexOf(".");
   var ext = filepath.substring(extStart, filepath.length).toUpperCase();
   if (ext != ".PNG" && ext != ".JPG") {
    alert("图片仅支持png,jpg格式");
    $("#qdctvfile11").val("");
    return false;
   }
  },
  success: function (data) {
   alert(data);
  }
 });
 function eventStart(obj) {
  $("#form1").submit();
 }

注意,代码中的eventStart方法是指在选择文件后,自动提交表单,而ajaxForm表示提交表单为异常方式,success回调方法是指异步返回表单地址的返回值。

2 跨域的初步实现

解决域访问,我们可以在服务端的响应头上添加Access-Control-Allow-Origin和Access-Control-Allow-Methods两个特性即可,这些特性在IE10以下的浏览器不被支持,很是郁闷。

/// <summary>
 /// MVC模式下跨域访问
 /// </summary>
 public class MvcCorsAttribute : ActionFilterAttribute
 {
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
   Dictionary<string, string> headers = new Dictionary<string, string>();

   headers.Add("Access-Control-Allow-Origin", "*");
   headers.Add("Access-Control-Allow-Methods", "*");
   foreach (var item in headers.Keys)
   {
    filterContext.RequestContext.HttpContext.Response.Headers.Add(item, headers[item]);
   }

   base.OnActionExecuting(filterContext);
  }
 }

注意,在生产环境下,我们的Access-Control-Allow-Origin应该是指定合法的域名的,*表示对所以网站都开放访问,这是危险的。

3 解决IE10以下不能跨域的问题

对于IE浏览器确实没法说了,虽然很喜欢微软的东西,但对于IE来说,我只能是NO,我真不想过多的去谈论它,先看看IE实现跨域上传的解决思想:由客户端不直接返回数据,而是重写向到客户端的callback地址,由callback像ajaxForm方法返回最终的数据,这样就解决了直接的跨域问题了。

/// <summary>
  /// 第三方的服务端
  /// </summary>
  /// <param name="name"></param>
  /// <returns></returns>
  [HttpPost]
  public ActionResult UploadResult()
  {
   string data = "{'code':'OK','thumpImgUrl':'http://127.0.0.1/images/1.jpg'}";
   return Redirect("http://localhost:9497/Home/UploadCallback?data=" + data);
  }

  /// <summary>
  /// 可能是服务端来调用它
  /// </summary>
  /// <returns></returns>
  public ActionResult UploadCallback(string data)
  {
   return Content(data);
  }

有些时候,我们在想一个问题的解决方法时,如果一条路走不通过,可以换换思路,也许会有意外的收获!

有人问,这块使用POST方式在服务端与客户端进行数据传递可以不可以,大叔说:不可以,因为POST在提交到客户端后,客户端处理,然后还是把结果返回给服务端,最后服务端再把结果返回给ajaxform,这还是又回到了开始的跨域问题,哈哈!

基于Jquery插件实现跨域异步上传文件功能

基于Jquery插件实现跨域异步上传文件功能

呵呵,怎么样,挺有意思的吧!

更多精彩内容,请点击《jQuery上传操作汇总》,进行深入学习和研究。

以上就是本文的全部内容,希望对大家的学习有所帮助,感谢各位的阅读!

Javascript 相关文章推荐
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
非html5实现js版弹球游戏示例代码
Sep 22 Javascript
js控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
jQuery实现折叠、展开的菜单组效果代码
Sep 16 Javascript
Javascript实现的SHA-256加密算法完整实例
Feb 02 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
jquery将信息遍历到界面上实例代码
Jan 21 jQuery
一篇文章学会Vue中间件管道
Jun 20 Vue.js
基于JavaScript实现省市联动效果
Jun 22 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 #Javascript
深入理解JS中的substr和substring
Apr 26 #Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 #Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 #Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 #Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 #Javascript
js 求时间差的实现代码
Apr 26 #Javascript
You might like
杏林同学录(一)
2006/10/09 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
Jquery ui css framework
2010/06/28 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
js实现3D旋转相册
2020/08/02 Javascript
python strip()函数 介绍
2013/05/24 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
python计算两个数的百分比方法
2018/06/29 Python
python实现字符串和字典的转换
2018/09/29 Python
Python实现ATM系统
2020/02/17 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
出国留学自荐信
2013/10/25 职场文书
2014年自我评价
2014/01/04 职场文书
青年教师培训方案
2014/02/06 职场文书
会计专业自荐信
2014/06/03 职场文书
新兵入伍心得体会
2014/09/04 职场文书
社区灵活就业证明
2014/11/03 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
2016新年问候语大全
2015/11/11 职场文书