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 相关文章推荐
jquery的ajax异步请求接收返回json数据实例
Jun 16 Javascript
JavaScript对象数组的排序处理方法
Oct 21 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 Javascript
Node.js中防止错误导致的进程阻塞的方法
Aug 11 Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 Javascript
canvas绘制环形进度条
Feb 23 Javascript
微信小程序实现天气预报功能
Jul 18 Javascript
node.js遍历目录的方法示例
Aug 01 Javascript
vue的全局变量和全局拦截请求器的示例代码
Sep 13 Javascript
利用js canvas实现五子棋游戏
Oct 11 Javascript
JS + HTML 罗盘式时钟的实现
May 21 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/02/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
python 中的int()函数怎么用
2017/10/17 Python
python中的闭包函数
2018/02/09 Python
详解python中asyncio模块
2018/03/03 Python
wxpython实现图书管理系统
2018/03/12 Python
python计算两个数的百分比方法
2018/06/29 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python实现微信好友的数据分析
2019/12/16 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
学校门卫岗位职责
2014/03/16 职场文书
阅兵口号
2014/06/19 职场文书
会议室标语
2014/06/21 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
Android 中的类文件和类加载器详情
2022/06/05 Java/Android