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 相关文章推荐
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
Apr 15 Javascript
js中方法重载如何实现?以及函数的参数问题
Aug 01 Javascript
js innerHTML 改变div内容的方法
Aug 03 Javascript
javascript事件冒泡实例分析
May 13 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
Oct 02 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
Jul 14 Javascript
JS实现的找零张数最小问题示例
Nov 28 Javascript
JS实现对json对象排序并删除id相同项功能示例
Apr 18 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
vue项目打包部署_nginx代理访问方法详解
Sep 20 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
vue2.0自定义指令示例代码详解
Apr 25 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
解析PHP工厂模式的好处
2013/06/18 PHP
php生成验证码函数
2015/10/20 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
UNIX文件类型
2013/08/29 面试题
交通专业个人自荐信格式
2013/09/23 职场文书
办公室助理岗位职责
2013/12/25 职场文书
技校毕业生自荐信
2014/06/03 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
保密工作整改报告
2014/11/06 职场文书
2015最新民情日记范文
2015/06/26 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python