基于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 相关文章推荐
javascript 构造函数强制调用经验总结
Dec 02 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
Jan 09 Javascript
关于JavaScript命名空间的一些心得
Jun 07 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
Aug 11 Javascript
jQuery实现的向下图文信息滚动效果
May 03 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
使用jQuery实现Web页面换肤功能的要点解析
May 12 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
Jul 11 Javascript
vue中rem的配置的方法示例
Aug 30 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
Apr 09 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
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php模板引擎技术简单实现
2016/03/15 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
利用js对象弹出一个层
2008/03/26 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js实现圆盘记速表
2015/08/03 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
教师实习的自我鉴定
2013/10/26 职场文书
应届大专生自荐书
2014/06/16 职场文书
护士辞职信怎么写
2015/02/27 职场文书
涨价通知怎么写
2015/04/23 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技