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 相关文章推荐
javascript动态加载二
Aug 22 Javascript
Javascript中this关键字的一些小知识
Mar 15 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
Sep 15 Javascript
java必学必会之static关键字
Dec 03 Javascript
三种AngularJS中获取数据源的方式
Feb 02 Javascript
详解Bootstrap的iCheck插件checkbox和radio
Aug 24 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
javaScript封装的各种写法
Aug 14 Javascript
详解cordova打包成webapp的方法
Oct 18 Javascript
npm 下载指定版本的组件方法
May 17 Javascript
讲解vue-router之什么是动态路由
May 28 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
Sep 09 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
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
跟老齐学Python之print详解
2014/09/28 Python
详解Python中DOM方法的动态性
2015/04/11 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
python避免死锁方法实例分析
2015/06/04 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python 错误处理 assert详解
2020/04/20 Python
python的数学算法函数及公式用法
2020/11/18 Python
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
JAVA程序员面试题
2012/10/03 面试题
个人担保书格式范文
2014/05/12 职场文书
班级文化标语
2014/06/23 职场文书
男性健康日的活动方案
2014/08/18 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
高中生逃课检讨书
2014/10/10 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书