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 相关文章推荐
利用腾讯的ip地址库做ip物理地址定位
Jul 24 Javascript
Jquery实现自定义tooltip示例代码
Feb 12 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
jQuery选择器源码解读(八):addCombinator函数
Mar 31 Javascript
关于延迟加载JavaScript
May 05 Javascript
Javascript进制转换实例分析
May 14 Javascript
javascript动态添加删除tabs标签的方法
Jul 06 Javascript
jQuery蓝色风格滑动导航栏代码分享
Aug 19 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
Javascript自定义事件详解
Jan 13 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 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在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
js使用formData实现批量上传
2020/03/27 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python中常用信号signal类型实例
2018/01/25 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
在vscode中配置python环境过程解析
2019/09/28 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Python安装OpenCV的示例代码
2020/03/05 Python
Django操作session 的方法
2020/03/09 Python
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
通信研究生自荐信
2014/02/01 职场文书
21岁生日感言
2014/02/27 职场文书
小学生安全责任书
2014/07/25 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
无工作证明怎么写
2015/06/15 职场文书
《西门豹》教学反思
2016/02/23 职场文书
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python