Jquery实现跨域异步上传文件总结


Posted in Javascript onFebruary 03, 2017

先说明白

这个跨域异步上传功能我们借助了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实现跨域异步上传文件总结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
$()JS小技巧
Jul 21 Javascript
告诉大家什么是JSON
Jun 10 Javascript
javascript string字符串优化问题
Jul 31 Javascript
Jquery 的扩展方法总结
Oct 01 Javascript
JS的replace方法介绍
Oct 20 Javascript
js中Number数字数值运算后值不对的解决方法
Feb 28 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
微信小程序开发摇一摇功能
Nov 22 Javascript
原生js实现日历效果
Mar 02 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
利用promise及参数解构封装ajax请求的方法
Mar 24 Javascript
js 递归和定时器的实例解析
Feb 03 #Javascript
js实现文本上下来回滚动
Feb 03 #Javascript
jquery代码规范让代码越来越好看
Feb 03 #Javascript
Javascript for in的缺陷总结
Feb 03 #Javascript
canvas绘制七巧板
Feb 03 #Javascript
JS对象是否拥有某属性如何判断
Feb 03 #Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 #Javascript
You might like
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
Python中的choice()方法使用详解
2015/05/15 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
python实现Adapter模式实例代码
2018/02/09 Python
python ddt实现数据驱动
2018/03/14 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
什么是makefile? 如何编写makefile?
2012/08/08 面试题
酒店个人培训自我鉴定
2013/12/11 职场文书
大学学习计划书范文
2014/05/02 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python