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 相关文章推荐
15 个 JavaScript Web UI 库
May 19 Javascript
JavaScript代码复用模式实例分析
Dec 02 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
May 17 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
Jul 12 Javascript
微信小程序 loading 详解及实例代码
Nov 09 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
Bootstrap进度条实现代码解析
Mar 07 Javascript
微信小程序 setData的使用方法详解
Apr 20 Javascript
node中Express 动态设置端口的方法
Aug 04 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
Oct 24 jQuery
小程序实现抽奖动画
Apr 16 Javascript
微信小程序实现吸顶效果
Jan 08 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下把数组保存为文件格式的实例应用
2010/02/08 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python 操作文件的基本方法总结
2017/08/10 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python3.4实现邮件发送功能
2018/05/28 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
python怎么判断素数
2020/07/01 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
寒假实习自荐信
2014/01/26 职场文书
体育节口号
2014/06/19 职场文书
大学生个人求职信例文
2014/07/07 职场文书
家长高考寄语
2015/02/27 职场文书
谢师宴家长致辞
2015/07/27 职场文书
尝试使用Python爬取城市租房信息
2022/04/12 Python